【发布时间】:2016-04-14 13:08:15
【问题描述】:
我正在尝试使用 ECDSA 生成带有私钥的(自签名)证书。 目标是获得与使用 openssl 时“相同”的 (pkcs12) 证书:
openssl ecparam -genkey -name secp256r1 -out mykey.key
openssl req -new -key mykey.key -out myreq.csr
openssl req -x509 -days 7 -key mykey.key -in myreq.csr -out mycert.crt
openssl pkcs12 -export -out mycert.pfx -inkey mykey.key -in mycert.crt
我已经使用 BouncyCastle 来帮助我创建基于 RSA 的证书,因此接下来的步骤或多或少遵循我用来创建 RSA 证书的方式。
(注意 BC 前缀用于 BouncyCastle 中的类,MS 用于 .NET 类)
1生成密钥对:私钥和公钥
BC.IAsymmetricCipherKeyPairGenerator bcKpGen = BC.GeneratorUtilities.GetKeyPairGenerator("ECDSA");
bcKpGen.Init(new BC.ECKeyGenerationParameters(BC.SecObjectIdentifiers.SecP256r1, new BC.SecureRandom()));
BC.AsymmetricCipherKeyPair bcSubjKeys = bcKpGen.GenerateKeyPair();
2使用私钥签署公钥和一些附加数据(主题、有效期等)
BC.X509V3CertificateGenerator bcXgen = new BC.X509V3CertificateGenerator();
// .. set subject, validity period etc
bcXgen.SetPublicKey(bcSubjKeys.Public);
BC.ISignatureFactory bcSigFac = new BC.Asn1SignatureFactory("SHA256WITHECDSA", bcSubjKeys.Private);
BC.X509Certificate bcCert = bcXgen.Generate(bcSigFac);
3“加入”来自 step1 的私钥和来自 step2 的证书以获取带有私钥的证书。
如果我对没有私钥的证书没问题,我可以这样做:
MS.X509Certificate mcCert = new MS.X509Certificate2(bcCert.GetEncoded(), null);
我已经完成了。
尝试设置私钥时出现问题:
msCert.PrivateKey = ConvertBouncyToNetSomehow(bcSubjKeys.Private)
(注意msCert.PrivateKey的类型是MS.AsymmetricAlgorithm,bcSubjKeys.Private的类型是BC.ECPrivateKeyParameters)
似乎合适的方法是使用MS.ECDsaCng类(继承自MS.AsymmetricAlgorithm),但是:
1 我发现将BC.ECPrivateKeyParameters 转换为MS.CngKey(MS.ECDsaCng 要求)的唯一方法是通过 pkcs8 格式:
BC.PrivateKeyInfo bcPKInfo = BC.PrivateKeyInfoFactory.CreatePrivateKeyInfo(bcSubjKeys.Private);
byte[] pkArr = bcPKInfo.GetDerEncoded();
MS.CngKey msPKCng = MS.CngKey.Import(pkArr, MS.CngKeyBlobFormat.Pkcs8PrivateBlob);
但是使用这种方法会丢失一些信息,因为msPKCng.AlgorithmGroup 的值是"ECDH" 而bcSubjKeys.Private.AlgorithmName说"ECDSA"。 ECDH-key 也不能与MS.ECDsaCng 一起使用。
尽管如此.. 我可以继续使用MS.ECDiffieHellmanCng 而不是请求的MS.ECDsaCng 如果..
2 实现MS.X509Certificate2.set_PrivateKey 需要对象实现接口MS.ICspAsymmetricAlgorithm。但他们中的任何一个(ECDsaCng、ECDiffieHellmanCng)都没有实现它。
此时似乎必须使用不同的方法(因为MS.ICspAsymmetricAlgorithm 条件),例如将证书和私钥导出到 pkcs 文件并使用X509Certificate2.Import(..)。
有什么提示吗? 问候
【问题讨论】:
标签: c# certificate ecdsa