尝试使用从CurrentUser Store检索到的证书的私钥时出错

时间:2019-04-10 23:48:03

标签: c# .net x509certificate certificate-store certenroll

我正在尝试使用我的证书代理证书签署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时,其外观与来自当前用户。

1 个答案:

答案 0 :(得分:0)

问题出在初始化,我将机器上下文设置为true而不是false使其失败。由于调试器工具正在显示该证书,因此已正确检索该证书。