我正在尝试使用我的证书代理证书签署CSR。但是,当我从currentUser的商店获取证书并且尝试使用密钥对其进行签名时,会出现此错误“ CertEnroll :: CSignerCertificate :: Initialize:找不到对象或属性。0x80092004(-2146885628 CRYPT_E_NOT_FOUND)”但是如果我得到它从LocalMachine商店获得,我没有这个问题,它可以工作。我无法使用本地计算机来存储证书,因为证书代理证书的私钥不可导出。
这是我从证书目录获取证书的代码:
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,string strCertificate))我遇到了上面提到的异常。在调试器中,当变量来自LocalMachine时,其外观与来自当前用户。
答案 0 :(得分:0)
问题出在初始化,我将机器上下文设置为true而不是false使其失败。由于调试器工具正在显示该证书,因此已正确检索该证书。