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