.NET Framework x509Certificate2-Klasse, HasPrivateKey == true && PrivateKey == null?
Ich versuche, mit einem X509-Zertifikat zu arbeiten, das ursprünglich in den CurrentUser-Keystore auf einem Windows 10-Computer mithilfe des Snap-Ins "Zertifikate" einer MMC importiert wurde. Das gleiche Verfahren wurde auf einem Windows 8.1-Computer mit dem gleichen Ergebnis getestet.
Mit dem Standard-PowerShell-PKI-Modul erhalte ich mit Get-Item ein X509Certificate2-Objekt:
$my_cert = Get-Item Cert:\CurrentUser\My\ADAA82188A17THUMBPRINTXXXXXXXXXXX
Die Ausgabe von$my_cert | fl *
ist wie folgt
PSPath : Microsoft.PowerShell.Security\Certificate::CurrentUser\My\XXXXXXXXXXXXXXXXXXX
PSParentPath : Microsoft.PowerShell.Security\Certificate::CurrentUser\My
PSChildName : XXXXXXXXXXXXXXXXXXX
PSDrive : Cert
PSProvider : Microsoft.PowerShell.Security\Certificate
PSIsContainer : False
EnhancedKeyUsageList : {Secure Email (1.3.6.1.5.5.7.3.4), IP security user (1.3.6.1.5.5.7.3.7), Encrypting File
System (1.3.6.1.4.1.311.10.3.4), Document Signing (1.3.6.1.4.1.311.10.3.12)...}
DnsNameList : {My Name}
SendAsTrustedIssuer : False
EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
PolicyId : {D52C406F-C279-4BF2-B7C2-EE704290DB3E}
Archived : False
Extensions : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid,
System.Security.Cryptography.Oid, System.Security.Cryptography.Oid...}
FriendlyName :
IssuerName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter : 4/15/2017 2:15:16 PM
NotBefore : 4/15/2016 2:15:16 PM
HasPrivateKey : True
PrivateKey :
PublicKey : System.Security.Cryptography.X509Certificates.PublicKey
RawData : {56, 130, 19, 252...}
SerialNumber : 4F0000002F700000000000000000000000
SubjectName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
SignatureAlgorithm : System.Security.Cryptography.Oid
Thumbprint : XXXXXXXXXXXXXXXXXXX
Version : 3
Handle : 2241663016272
Issuer : CN=Issuing CA, DC=My, DC=Domain, DC=us
Subject : E=my.name@my.domain.us, CN=My Name
So HasPrivateKey == True, aber PrivateKey == null. Ich habe versucht, herauszufinden, wie man Zugriff auf den privaten Schlüssel erhält, um die Ver- und Entschlüsselung durchzuführen. Die Beispiele, die ich online gesehen habe, scheinen darauf hinzudeuten, dass die PrivateKey-Eigenschaft der X509Certificate2-Klasse verfügbar sein sollte, aber anscheinend habe ich etwas übersehen.
Ich habe hier ähnliche Fragen gelesen, wie zBEmpty PrivateKey in x509certificate2, aber keiner scheint mein Problem zu lösen. Ich habe auch gelesen Acht Tipps zum Arbeiten mit X.509-Zertifikaten in .NET von Paul Stovell, der sehr aufschlussreich war, aber letztendlich nicht half. Es hat mir geholfen, zu überprüfen, ob der private Schlüssel an der richtigen Stelle vorhanden ist und, soweit ich das beurteilen kann, über die richtigen Berechtigungen verfügt, auf die die x509Certificate2-Klasse verweist:
C:\Users\My.Name\AppData\Roaming\Microsoft\SystemCertificates\My\Keys
Der Name der Schlüsseldatei stimmt mit dem Subject Key Identifier auf dem Zertifikat überein.
Bearbeiten
Die Ausgabe voncertutil -user -store my "Serial Number"
ist:
Serial Number: 4f000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Issuer: CN=Issuing CA, DC=My, DC=Domain, DC=us
NotBefore: 4/15/2016 2:15 PM
NotAfter: 4/15/2017 2:15 PM
Subject: E=my.name@my.domain.us, CN=My Name
Non-root Certificate
Template: Userv1, User v1
Cert Hash(sha1): ad ab 82 18 8a 17 4d 75 11 04 48 7c 43 43 d4 05 b9 74 c8 4c
Key Container = te-Userv1-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Unique container name: fcbba1aa0xxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Provider = Microsoft Software Key Storage Provider
Encryption test passed
CertUtil: -store command completed successfully.
Welche "Schlüssel" -Information fehlt mir hier? Warum wird der private Schlüssel nicht bequem vom X509Certificate2-Objekt referenziert? Wie erhalte ich Zugriff darauf?