.NET Framework x509Certificate2 Class, HasPrivateKey == true && PrivateKey == null?
Estoy intentando trabajar con un certificado X509 que se importó originalmente en el almacén de claves de CurrentUser en una computadora con Windows 10 usando el complemento "Certificados" de una MMC. Se ha probado el mismo procedimiento en una computadora con Windows 8.1 con el mismo resultado.
Usando el módulo estándar de PowerShell PKI, obtengo un objeto X509Certificate2 usando Get-Item:
$my_cert = Get-Item Cert:\CurrentUser\My\ADAA82188A17THUMBPRINTXXXXXXXXXXX
La salida de$my_cert | fl *
es como sigue:
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 : [email protected], CN=My Name
Entonces HasPrivateKey == True, pero PrivateKey == null. He estado tratando de descubrir cómo obtener acceso a la clave privada para realizar el cifrado y descifrado. Todos los ejemplos que he visto en línea parecen indicar que la propiedad PrivateKey de la clase X509Certificate2 debería estar fácilmente disponible, pero aparentemente me he perdido algo.
He leído preguntas similares aquí, comoPrivateKey vacío en x509certificate2, pero ninguno parece resolver mi problema. Tambien he leidoOcho consejos para trabajar con certificados X.509 en .NET por Paul Stovell, que fue muy esclarecedor, pero finalmente no ayudó. Me ayudó a verificar que la clave privada existe en el lugar correcto y, por lo que puedo decir, con los permisos correctos a los que hace referencia la clase x509Certificate2:
C:\Users\My.Name\AppData\Roaming\Microsoft\SystemCertificates\My\Keys
El nombre del archivo de clave coincide con el Identificador de clave de asunto en el certificado.
Editar:
La salida decertutil -user -store my "Serial Number"
es:
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: [email protected], 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.
¿Qué información "clave" me estoy perdiendo aquí? ¿Por qué no se hace referencia conveniente a la clave privada del objeto X509Certificate2? ¿Cómo obtengo acceso a él?