Lire la Clé Privée à partir de PFX-fichier

Je sais, il y a de nombreux posts sur ce sujet, mais encore je ne peux pas trouver une solution pour que cela fonctionne. J'ai généré un PFXfichier avec openssl sur ma machine comme ceci:

openssl x509 -req -days 365 -in "myReqest.csr" -signkey "myPrivateKey.pem" -out "myCertificate.crt"
openssl pkcs12 -export -out "myCertificate.pfx" -inkey "myPrivateKey.pem" -in "myCertificate.crt" -certfile "myCertificate.crt"

Dans mon application en C#, j'ai accès à la clé privée comme ceci:

var cert = new X509Certificate2("myCertificate.pfx", "myPassword");
cert.HasPrivateKey; //This is always true!
cert.PrivateKey; //Works on my machine (only)

Cela fonctionne parfaitement bien (sur mon de la machine), mais quand j'exécute le même code sur un autre machine, il lance: "jeu de Clé n'est pas trouvée", même si HasPrivateKey retourne true! Ne pas la clé privée être inclus dans le *.pfx-fichier? Pouvez-vous me dire:

  1. Était le certificat/clé privée en quelque sorte automatiquement installé sur ma machine par openssl quand je l'ai créé?

  2. Comment puis-je lire la clé privée à partir de la *.PFX-fichier (ou, alternativement, à partir de la *.PEM-fichier)?

StackTrace d'Exception:

at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContaier)
at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContaier, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
at System.Security.Cryptography.RSACryptoServiceProvider..ctor(CspParameters parameter)
at System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()

Mise à jour:

J'ai découvert, que le code suivant fonctionne:

//on my machine
//read certificate from file (exportable!)
X509Certificate2 cert = new X509Certificate2("filename.pfx", "password", X509KeyStorageFlags.Exportable)
//sign data etc.
((RSACryptoServiceProvider)cert.PrivateKey).SignData(...
//export private key to XML-file
File.WriteAllText("filename.xml", cert.PrivateKey.ToXmlString(true));

//on the other machine
//create new RSA object
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
//import private key from xml
rsa.FromXmlString(File.ReadAllText("filename.xml"));
//verify data etc.
rsa.VerifyData(...

Cependant, pour moi, ce n'est qu'une solution de contournement, j'aimerais le faire d'une manière plus classique/norme conforme à la!

Je devine: c'est un privé clé générée sur de la machine, de sorte que machine ne peut l'utiliser (j'ai abusé de l'italique pour mettre l'accent)
êtes-vous également en cours d'exécution des commandes sur l'autre machine? (tout ce que vous a été mentionné, le "code").
Ce n'est pas très utile. J'ai pensé que la clé privée a été censé pour être inclus dans le fichier de certificat, puisqu'il résidait dans un autre fichier que j'ai créé à l'avance et que j'ai inclus explicitement lors de la création du certificat avec openssl.
Correct, je ne suis que de l'exécution de la code sur l'autre machine. C'est ce que je voulais faire à fournir la clé privée à l'application en remettant le fichier de certificat contenant.

OriginalL'auteur marsze | 2013-11-25