“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中看到一个新证书,告诉我该证书是有效的,并且我有一个该证书的私钥。在
oaming\Microsoft\SystemCertificates\My\Keys
但当我使用
我想只是有一点细节缺失,但我就是不知道它是什么。有什么想法吗?
顺便说一句,我已经尝试使用密钥和容器的密码,正如我在网上找到的一些主题中所建议的那样,这也没有帮助。
好吧,我自己想出来了。罪魁祸首不是上面的代码,而是生成密钥对的方式。对于每一个在这里遇到同样问题的人来说,问题是什么,工作是什么。
导致问题的原始密钥生成:
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你的代码做得很好,但是文档真的很糟糕。;-)