"缺少存储的密钥集"当使用bouncycastle和.NET的混合时

时间:2018-03-06 11:40:19

标签: c# bouncycastle x509certificate2 certutil

成功将ECC私钥附加到我从PKI检索到的X509Certificate2之后(紧接着this SO question的答案),我要求在没有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中看到一个新证书,告诉我证书是vaild,并且我有一个私钥用于此证书。 %USER_HOME%\AppData\Roaming\Microsoft\SystemCertificates\My\Keys中还有一个新条目。

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

我认为这只是一个小细节,但我无法找出它是什么。有什么想法吗?

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

1 个答案:

答案 0 :(得分: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你的代码做得很好,但文档真的很糟糕。 ; - )