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:
-
Était le certificat/clé privée en quelque sorte automatiquement installé sur ma machine par openssl quand je l'ai créé?
-
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!
ê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
Vous devez vous connecter pour publier un commentaire.
Peut-être que vous pouvez nous en dire un peu plus sur pourquoi vous voulez le faire. Il y a certainement de bonnes raisons à cela, comme l'écriture d'un programme qui serait assis sur votre serveur interne pour automatiser produit construit.
Mais si vous avez l'intention de distribuer cette application à l'extérieur d'une grande zone de confiance (par exemple, pour les clients), alors la réponse est NE fais PAS ÇA! Vous ne devriez jamais donner votre fichier de clé privée. Qu'il l'ouvre aux attaques de force de votre mot de passe (qui est certainement beaucoup plus faible que la clé privée lui-même). Et si vous distribuez votre application, puis votre mot de passe est inclus dans texte brut dans le code MSIL. Là, il peut être facilement visualisées à l'aide de tout code managé désassembleur (par exemple Réflecteur) , et il peut même probablement être visualisés avec un texte ou un éditeur hexadécimal.
En résumé, la distribution de votre fichier de clé privée avec votre demande à quelqu'un qui leur permet de signer facilement ce qu'ils veulent avec VOTRE cert. Le point de l'ensemble d'une clé privée est à conserver précieusement enfermé dans un endroit où il ne peut jamais être consulté par n'importe qui, mais vous (ou votre organisation, etc).
such as writing a program that would sit on your company's internal server to automate product builds
... vous l'avez, pas plus à dire ici. Les autres choses que vous avez mentionnés, je sais déjà. Cependant, comme vous pouvez le voir dans ma réponse, j'ai trouvé une meilleure solution.OriginalL'auteur drwatsoncode
Il semble, il n'est pas simple façon de le faire .NET. Donc j'ai décidé aujourd'hui de charger le certificat directement à partir du magasin de certificats:
Pour que, bien sûr, si doit être installé sur la machine.
Je pense que c'est une bonne solution à ce problème, car il ajoute une couche de sécurité supplémentaire (l'application doit être exécutée sur la machine, sur laquelle le certificat est installé et que l'utilisateur qui a installé, le fichier lui-même peut être stocké dans un endroit sûr ailleurs).
devrait fonctionner, je suppose. À noter qu'avec cette approche, la clé privée est gérée par windows cert magasin.
OriginalL'auteur marsze
Vous devez charger le certificat comme ceci:
X509Certificate2 cert = new X509Certificate2("a.pfx", "password", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet)
Ce post explique pourquoi http://paulstovell.com/blog/x509certificate2
OriginalL'auteur Bogdan
La clé par défaut défini n'existe pas sur l'autre machine (Le jeu de clés de l'utilisateur est généralement la valeur par défaut), probablement en raison d'une asp.net application (c'est à dire qu'il n'a pas de profil de l'utilisateur). Si vous passer
X509KeyStorageFlags.MachineKeySet
comme troisième argument de laX509Certificate2
constructeur, alors il devrait fonctionner de la même manière sur les deux machines.La raison pour laquelle il ne se produit que lors de l'accès à la
PrivateKey
propriété est que c'est le premier endroit où une véritable CSP objet est créé à l'utilisation de la touche.Peut-Être X509KeyStorageFlags.Exportable fonctionne alors? L'exception indique clairement un problème avec la touche set. Vous pouvez combiner Exportable avec MachineKeySet ou UserKeySet aussi.
Il n'a pas j'ai essayé tout ça. Le problème semble être qqch de complètement différent.
OriginalL'auteur Pent Ploompuu
Vous pouvez également obtenir le privé par le biais de la méthode ci-dessous.
De certificat de variable, vous pouvez également obtenir d'autres informations telles que la Clé Publique etc.
OriginalL'auteur Ashwin Saravanan