【发布时间】:2015-09-11 06:09:25
【问题描述】:
我需要生成我自己的 DSA 密钥对,并使用 C# 将其作为私钥和证书包存储在 .p12 文件中。
这个问题
How do I create a PKCS12 .p12 file in C#?
似乎非常相似,但不幸的是,它对我没有帮助,因为存在一些显着差异(RSA 与 DSA 等)
我正在尝试使用 System.Security.Cryptography.DSACryptoServiceProvider 生成密钥对,然后使用 Bouncy Castle 生成 X509 证书:
using (DSACryptoServiceProvider csp = new DSACryptoServiceProvider(1024))
{
privKeyDSA = csp.ExportParameters(true);
pubKeyDSA = csp.ExportParameters(false);
var keypair = DotNetUtilities.GetDsaKeyPair(privKeyDSA);
var gen = new X509V3CertificateGenerator();
var CN = new X509Name("CN=" + "TEST");
var SN = BigInteger.ProbablePrime(120, new Random());
gen.SetSerialNumber(SN);
gen.SetSubjectDN(CN);
gen.SetIssuerDN(CN);
gen.SetNotAfter(DateTime.MaxValue);
gen.SetNotBefore(DateTime.Now.Subtract(new TimeSpan(7, 0, 0, 0)));
gen.SetSignatureAlgorithm("sha1WithDSA");
gen.SetPublicKey(DotNetUtilities.GetDsaPublicKey(pubKeyDSA));
var newCert = gen.Generate(keypair.Private);
certificateDSA = new X509Certificate2(DotNetUtilities.ToX509Certificate((Org.BouncyCastle.X509.X509Certificate)newCert));
certificateDSA.PrivateKey = csp;
StringBuilder builder = new StringBuilder();
builder.AppendLine("-----BEGIN CERTIFICATE-----");
builder.AppendLine(Convert.ToBase64String(certificateDSA.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks));
builder.AppendLine("-----END CERTIFICATE-----");
string result = builder.ToString();
byte[] pkcsData = certificateDSA.Export(X509ContentType.Pfx, "changeit");
}
但是,certificateDSA.PrivateKey = csp; 行会抛出带有消息的CryptographicUnexpectedOperationException:"The public key of the certificate does not match the value specified."
我真的不明白发生了什么。我究竟做错了什么?谢谢!
【问题讨论】:
标签: c# security cryptography x509certificate bouncycastle