.NETからX.509証明書の秘密鍵ファイルに読み取り許可を設定する方法

StackOverflow https://stackoverflow.com/questions/425688

  •  06-07-2019
  •  | 
  •  

質問

ここに、証明書ストアにpfxを追加するコードを示します。

X509Store store = new X509Store( StoreName.My, StoreLocation.LocalMachine );
store.Open( OpenFlags.ReadWrite );
X509Certificate2 cert = new X509Certificate2( "test.pfx", "password" );
store.Add( cert );
store.Close();

ただし、秘密鍵にアクセスするNetworkServiceのアクセス許可を設定する方法が見つかりませんでした。

誰でも光を当てることができますか?事前に感謝します。

役に立ちましたか?

解決

プログラムで行うには、次の3つのことを行う必要があります。

  1. 秘密鍵フォルダーのパスを取得します。

  2. そのフォルダー内の秘密鍵のファイル名を取得します。

  3. そのファイルに許可を追加します。

コードの例については、この投稿をご覧ください。 3つすべてを実行します(具体的には、" AddAccessToCertificate"メソッドを参照)。

他のヒント

この回答は遅れていますが、ここで検索する他の人に投稿したかったです:

CryptoKeySecurity こちら、C#のソリューションの例:

var rsa = certificate.PrivateKey as RSACryptoServiceProvider;
if (rsa != null)
{
    // Modifying the CryptoKeySecurity of a new CspParameters and then instantiating
    // a new RSACryptoServiceProvider seems to be the trick to persist the access rule.
    // cf. http://blogs.msdn.com/b/cagatay/archive/2009/02/08/removing-acls-from-csp-key-containers.aspx
    var cspParams = new CspParameters(rsa.CspKeyContainerInfo.ProviderType, rsa.CspKeyContainerInfo.ProviderName, rsa.CspKeyContainerInfo.KeyContainerName)
    {
        Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore,
        CryptoKeySecurity = rsa.CspKeyContainerInfo.CryptoKeySecurity
    };

    cspParams.CryptoKeySecurity.AddAccessRule(new CryptoKeyAccessRule(sid, CryptoKeyRights.GenericRead, AccessControlType.Allow));

    using (var rsa2 = new RSACryptoServiceProvider(cspParams))
    {
        // Only created to persist the rule change in the CryptoKeySecurity
    }
}

SecurityIdentifierを使用してアカウントを識別していますが、NTAccountも同様に機能します。

これが他の誰かに役立つ場合、PowershellでJim Floodの回答を書きました

function Set-PrivateKeyPermissions {
param(
[Parameter(Mandatory=$true)][string]$thumbprint,
[Parameter(Mandatory=$false)][string]$account = "NT AUTHORITY\NETWORK SERVICE"
)
#Open Certificate store and locate certificate based on provided thumbprint
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My","LocalMachine")
$store.Open("ReadWrite")
$cert = $store.Certificates | where {

これが他の誰かに役立つ場合、PowershellでJim Floodの回答を書きました

<*>

アカウントパラメータは、「DOMAIN \ USER」の形式にすることができます。同様に(名前に組み込まれているだけでなく)-これを自分の環境でテストし、適切なSIDに自動的に変換しました

.Thumbprint -eq $thumbprint} #Create new CSP object based on existing certificate provider and key name $csp = New-Object System.Security.Cryptography.CspParameters($cert.PrivateKey.CspKeyContainerInfo.ProviderType, $cert.PrivateKey.CspKeyContainerInfo.ProviderName, $cert.PrivateKey.CspKeyContainerInfo.KeyContainerName) # Set flags and key security based on existing cert $csp.Flags = "UseExistingKey","UseMachineKeyStore" $csp.CryptoKeySecurity = $cert.PrivateKey.CspKeyContainerInfo.CryptoKeySecurity $csp.KeyNumber = $cert.PrivateKey.CspKeyContainerInfo.KeyNumber # Create new access rule - could use parameters for permissions, but I only needed GenericRead $access = New-Object System.Security.AccessControl.CryptoKeyAccessRule($account,"GenericRead","Allow") # Add access rule to CSP object $csp.CryptoKeySecurity.AddAccessRule($access) #Create new CryptoServiceProvider object which updates Key with CSP information created/modified above $rsa2 = New-Object System.Security.Cryptography.RSACryptoServiceProvider($csp) #Close certificate store $store.Close() }

アカウントパラメータは、「DOMAIN \ USER」の形式にすることができます。同様に(名前に組み込まれているだけでなく)-これを自分の環境でテストし、適切なSIDに自動的に変換しました

一部として出荷される WinHttpCertCfg.exeツールを使用できます Windows Server 2003リソースキットツール

例:

winhttpcertcfg -g -c LOCAL_MACHINE\My -s test -a NetworkService


または、WCFに同梱されている秘密鍵の検索ツールを使用することもできます。 SDK。証明書の秘密キーファイルのディスク上の場所を検索します。次に、ACLを使用して、ファイルに適切な特権を設定します。

例:

FindPrivateKey My LocalMachine -n "CN=test"

これは、誰かが興味を持っている場合にWindows Server 2008で見つけたソリューションです。 http ://technet.microsoft.com/en-us/library/ee662329.aspx

基本的に、MMCツールを使用して証明書にアクセスする必要があるサービスにアクセス許可を付与する必要がありました。チャームのように機能します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top