.NET Framework x509Certificate2 Class, HasPrivateKey == true && PrivateKey == null?

Я пытаюсь работать с сертификатом X509, который изначально был импортирован в хранилище ключей CurrentUser на компьютере с Windows 10 с помощью оснастки MMC «Сертификаты». Эта же процедура была протестирована на компьютере под управлением Windows 8.1 с тем же результатом.

Используя стандартный модуль PowerShell PKI, я получаю объект X509Certificate2, используя Get-Item:

$my_cert = Get-Item Cert:\CurrentUser\My\ADAA82188A17THUMBPRINTXXXXXXXXXXX

Выход из$my_cert | fl * как следует:

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

Итак, HasPrivateKey == Истина, но PrivateKey == ноль. Я пытался выяснить, как получить доступ к закрытому ключу для выполнения шифрования и дешифрования. Все примеры, которые я видел в Интернете, показывают, что свойство PrivateKey класса X509Certificate2 должно быть легко доступно, но, видимо, я что-то упустил.

Я читал подобные вопросы здесь, такие какПустой PrivateKey в x509certificate2Но, похоже, никто не решил мою проблему. Я также прочиталВосемь советов по работе с сертификатами X.509 в .NET Полом Стовеллом, который был очень поучительным, но в конечном итоге не помог. Это помогло мне проверить, что закрытый ключ существует в правильном месте и, насколько я могу судить, с правильными разрешениями, на которые ссылается класс x509Certificate2:

C:\Users\My.Name\AppData\Roaming\Microsoft\SystemCertificates\My\Keys

Имя файла ключа соответствует идентификатору ключа субъекта в сертификате.

Редактировать:

Выход изcertutil -user -store my "Serial Number" является:

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.

Какую «ключевую» информацию я здесь упускаю? Почему закрытый ключ не является удобной ссылкой из объекта X509Certificate2? Как мне получить к нему доступ?

Ответы на вопрос(3)

Ваш ответ на вопрос