Ошибка при попытке использовать закрытый ключ сертификата, полученный из хранилища текущего пользователя

#c# #.net #x509certificate #certificate-store #certenroll

#c# #.net #x509certificate #хранилище сертификатов #certenroll

Вопрос:

Я пытаюсь подписать CSR с помощью моего сертификата агента сертификации. однако, когда я получаю сертификат из хранилища текущего пользователя и пытаюсь использовать ключ для его подписи, я получаю эту ошибку «CertEnroll::CSignerCertificate::Initialize: не удается найти объект или свойство. 0x80092004 (-2146885628 CRYPT_E_NOT_FOUND)» однако, если я получу его из хранилища LocalMachine, у меня нет этой проблемы, и она работает. Я не могу использовать локальный компьютер для хранения сертификата, поскольку сертификаты агента сертификации имеют свой закрытый ключ как не подлежащий экспорту.

это мой код для получения сертификата из sotre сертификата:

         const string ekuOid = "2.5.29.37";
        const string enrollmentAgentOid = "1.3.6.1.4.1.311.20.2.1";
        var store = new X509Store("MY", StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly);
        X509Certificate2 certificate = null;
        foreach (var cert in store.Certificates)
        {
            if (!cert.HasPrivateKey || cert.NotBefore > DateTime.UtcNow || DateTime.UtcNow > cert.NotAfter) { continue; }
            foreach (var eku in cert.Extensions.Cast<X509Extension>().Where(ext => ext.Oid.Value == ekuOid).Cast<X509EnhancedKeyUsageExtension>())
            {
                if (eku.EnhancedKeyUsages.Cast<Oid>().Any(usage => usage.Value == enrollmentAgentOid))
                {
                    certificate = cert;
                }
            }
        }
        return certificate;
  

но когда я вызываю инициализатор CERTENROLLLib (Инициализировать(bool MachineContext, X509PrivateKeyVerify VerifyType, EncodingType Encoding, string strCertificate)) Я получаю исключение, упомянутое выше. глядя на отладчик, переменная выглядит одинаково, когда она поступает из LocalMachine, чем когда она поступает от текущего пользователя.

Комментарии:

1. Вы установили сертификат как CurrentUser MY, так и LocalMachine MY? Похоже, вы сделали только позже

2. да, я сделал это в обоих, я фактически создал другой шаблон, чтобы сделать его экспортируемым, запросить сертификат в контексте CurrentUser, перейти в это хранилище, экспортировать сертификат и импортировать его в мое хранилище LocalMachine

Ответ №1:

проблема была в initialze, я устанавливал для контекста компьютера значение true вместо false, что приводило к сбою. сертификат был правильно восстановлен, как это было показано инструментами отладчика.