[c#] Come impostare l'autorizzazione di lettura sul file della chiave privata del certificato X.509 da .NET


Answers

Questa risposta è in ritardo ma volevo postarla per chiunque altro venisse a cercare qui:

Ho trovato un articolo del blog MSDN che ha fornito una soluzione utilizzando CryptoKeySecurity here , ed ecco un esempio di una soluzione in 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
    }
}

Sto usando un SecurityIdentifier per identificare l'account ma un account NTA funzionerebbe altrettanto bene.

Question

Ecco il codice per aggiungere un pfx all'archivio Cert.

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

Tuttavia, non sono riuscito a trovare un modo per impostare l'autorizzazione per NetworkService per accedere alla chiave privata.

Qualcuno può far luce? Grazie in anticipo.




È possibile utilizzare lo strumento WinHttpCertCfg.exe fornito come parte degli strumenti del Resource Kit di Windows Server 2003 .

Esempio:

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


In alternativa, è possibile utilizzare lo strumento Trova chiave privata fornito con l'SDK WCF per trovare la posizione sul disco del file della chiave privata del certificato. Quindi puoi semplicemente usare ACL per impostare i privilegi giusti sul file.

Esempio:

FindPrivateKey My LocalMachine -n "CN=test"



Links