【发布时间】:2018-06-02 18:58:27
【问题描述】:
我需要创建由“根”证书(自签名,ECDSA)签名的“客户端”ECDSA 证书。 “根”证书已按照Translating Elliptic Curve parameters (BC to MS) 中的说明创建。
可以使用稍微修改的算法来创建“客户端”证书(由“根”签名)。
不同之处在于必须从“外部”提供私钥(用于从为“客户端”证书生成的密钥对中签署公钥) - 它是“根”证书的私钥。
但这就是问题所在。我找不到一种方法来获取并将私钥转换为可以传递给签名工厂的 Org.BouncyCastle.Crypto.Parameters.ECPrivateKeyParameters 类型。
// 1. get private-key of "Root" certificate from existing certificate:
byte[] msRootCertData = File.ReadAllBytes(@"c:\root_ecdsa_cert.pfx");
X509Certificate2 msRootCert = new X509Certificate2(msRootCertData);
ECDsaCng msRootPrivateKey = msRootCert.GetECDsaPrivateKey() as ECDsaCng;
ECParameters msRootPrivateKeyParameters = msRootPrivateKey.ExportParameters(true);
// here comes the issue:
ECPrivateKeyParameters bcRootPrivateKeysParameters = TranslateMSKeysToBouncy(msRootPrivateKeyParameters);
// 2. generate "Client" key-pair:
AsymmetricCipherKeyPair bcClientKeyPair = bcKeyGen.GenerateKeyPair();
ECPrivateKeyParameters bcClientPrivKey = (ECPrivateKeyParameters)bcClientKeyPair.Private;
ECPrivateKeyParameters bcClientPublKey = (ECPublicKeyParameters)bcClientKeyPair.Public;
// 3. create X509 certificate:
X509V3CertificateGenerator bcCertGen = new X509V3CertificateGenerator();
bcCertGen.SetPublicKey(bcClientPublKey);
// .. set subject, validity period etc
ISignatureFactory sigFac = new Asn1SignatureFactory("Sha256WithECDSA", bcRootPrivateKeysParameters);
Org.BouncyCastle.X509.X509Certificate bcClientX509Cert = bcCertGen.Generate(sigFac);
byte[] x509CertEncoded = bcClientX509Cert.GetEncoded();
// 其余同上例。
有什么提示吗? 还是有其他方法? (例如:将 X509Certificate2 的实例直接传递给 BouncyCastle 库(避免将私钥转换为 Cng),或者在没有 BouncyCastle 的情况下生成“客户端”证书) 谢谢。
【问题讨论】:
标签: c# certificate ecdsa