Ошибка при попытке использовать закрытый ключ сертификата, полученный из магазина CurrentUser - PullRequest
0 голосов
/ 11 апреля 2019

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

это мой код для получения сертификата от cert 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 (Initialize (bool MachineContext, X509PrivateKeyVerify VerifyType, EncodingType Encoding, строка strCertificate)) Я получаю исключение, упомянутое выше. Смотря на отладчик, переменная выглядит так же, когда она поступает из LocalMachine, чем когда она поступает от текущего пользователя.

1 Ответ

0 голосов
/ 16 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...