关于使用bouncycastle和.NET混合时的c#:“缺少存储的密钥集”

“Missing stored keyset” when using mix of bouncycastle and .NET

在成功地将ECC私钥附加到我从PKI中检索到的X509Certificate2之后(紧跟着这个SO问题的答案),我需要在没有P/Invoke的情况下执行此操作。

所以我尝试使用这样的弹性柱来附加键:

1
2
3
4
5
6
7
8
9
10
11
12
13
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
oaming\Microsoft\SystemCertificates\My\Keys
中也有一个新条目。

但当我使用certutil -user -store my时,它会告诉我"缺少存储的密钥集"。因此,存储的证书似乎缺少到存储密钥的链接,或者链接错误。

我想只是有一点细节缺失,但我就是不知道它是什么。有什么想法吗?

顺便说一句,我已经尝试使用密钥和容器的密码,正如我在网上找到的一些主题中所建议的那样,这也没有帮助。


好吧,我自己想出来了。罪魁祸首不是上面的代码,而是生成密钥对的方式。对于每一个在这里遇到同样问题的人来说,问题是什么,工作是什么。

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

1
2
3
4
5
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();

这就是工作准则:

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

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