成功将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
时,它告诉我"缺少存储的密钥集"。因此,存储的证书似乎错过了存储密钥的链接或链接错误。
我认为这只是一个小细节,但我无法找出它是什么。有什么想法吗?
顺便说一下,我已经尝试使用密码和容器的密码,正如我在网上找到的一些主题所建议的那样,这也没有用。
答案 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你的代码做得很好,但文档真的很糟糕。 ; - )