0

在成功地将 ECC 私钥附加到我从 PKI 中检索到的 X509Certificate2 之后(主要遵循这个 SO 问题的答案),我需要在没有 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,它告诉我“缺少存储的密钥集”。所以存储的证书似乎错过了存储密钥的链接或有错误的链接。

我认为这只是缺少一个小细节,但我就是不知道它是什么。有任何想法吗?

顺便说一句,我已经尝试按照我在网上找到的一些主题中的建议使用密钥和容器的密码,但这也无济于事。

4

1 回答 1

0

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

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

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,你的代码做得很好,但文档真的很烂。;-)

于 2018-03-07T07:04:05.200 回答