首页 > 解决方案 > 尝试使用从 CurrentUser Store 检索到的证书的私钥时出错

问题描述

我正在尝试使用我的证书代理证书签署 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, string strCertificate)) 时,我得到了上面提到的异常。查看调试器,当它来自 LocalMachine 时,变量看起来与来自 LocalMachine 时相同来自当前用户。

标签: c#.netx509certificatecertificate-storecertenroll

解决方案


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


推荐阅读