#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, что приводило к сбою. сертификат был правильно восстановлен, как это было показано инструментами отладчика.