"Missing stored keyset" 混合使用 bouncycastle 和 .NET 时

"Missing stored keyset" when using mix of bouncycastle and .NET

在成功地将 ECC 私钥附加到我从 PKI 中检索到的 X509Certificate2 之后(主要是根据 的答案),我需要在没有 P/Invoke 的情况下执行此操作。

所以我尝试像这样使用 bouncycastle 附加密钥:

var pkcs12Store = new Pkcs12Store();
var certEntry = new X509CertificateEntry(bouncyCastleCertificate);
pkcs12Store.SetKeyEntry(friendlyName, new AsymmetricKeyEntry(bouncyCastleKeyPair.Private), new[] { certEntry });
using (MemoryStream pfxStream = new MemoryStream())
{
    pkcs12Store.Save(pfxStream, null, new SecureRandom());
    pfxStream.Seek(0, SeekOrigin.Begin);
    byte[] rawData = pfxStream.ToArray();
    var result = Pkcs12Utilities.ConvertToDefiniteLength(rawData);
    var microsoftCert = new X509Certificate2();
    microsoftCert.Import(result, (string)null, X509KeyStorageFlags.UserKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
    return microsoftCert ;
}

这似乎部分有效,因为我可以在 MMC 中看到一个新证书,告诉我该证书有效并且我有该证书的私钥。 %USER_HOME%\AppData\Roaming\Microsoft\SystemCertificates\My\Keys.

中也有一个新条目

但是当我使用 certutil -user -store my 时,它会告诉我 "missing stored keyset"。所以存储的证书似乎错过了存储密钥的 link 或者有一个错误的 link.

我认为它只是缺少了一点细节,但我就是找不到它是什么。有什么想法吗?

顺便说一下,我已经尝试按照我在网上找到的一些主题中的建议对密钥和容器使用密码,但这也没有帮助。

好的,我自己想出来了。罪魁祸首不是上面的代码,而是密钥对的生成方式。对于在同一问题上绊倒的每个人,这里是错误的地方和有效的地方。

导致问题的原始密钥生成:

var eccParameters = TeleTrusTNamedCurves.GetByName("brainpoolP384r1");
var domainParameters = new ECDomainParameters(eccParameters.Curve, eccParameters.G, eccParameters.N, eccParameters.H, eccParameters.GetSeed());
IAsymmetricCipherKeyPairGenerator keyPairGenerator = GeneratorUtilities.GetKeyPairGenerator("ECDSA");
keyPairGenerator.Init(new ECKeyGenerationParameters(domainParameters, new SecureRandom()));
AsymmetricCipherKeyPair keyPair = keyPairGenerator.GenerateKeyPair();

这就是工作代码:

IAsymmetricCipherKeyPairGenerator keyPairGenerator = GeneratorUtilities.GetKeyPairGenerator("ECDSA");
DerObjectIdentifier curveIdentifier = TeleTrusTObjectIdentifiers.BrainpoolP384R1;
keyPairGenerator.Init(new ECKeyGenerationParameters(curveIdentifier, new SecureRandom()));
return keyPairGenerator.GenerateKeyPair();

嘿,Bouncycastle,你的代码做得很好,但文档真的很糟糕。 ;-)