Ich versuche, (selbstsigniertes) Zertifikat mit privatem Schlüssel mit ECDSA zu generieren. Die Ziele sind „das gleiche“ (pkcs12) Zertifikat als bei der Verwendung von OpenSSL zu bekommen:Zertifikat mit ECDSA in c generieren #
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
ich schon BouncyCastle verwenden, mir zu helfen mit dem Erstellen von RSA-basiertem Zertifikat (e), so dass beim nächsten Schritt mehr oder weniger folgen die Art, wie ich RSA-Zertifikate erstelle.
(beachten Sie, dass BC
Präfix für Klassen von BouncyCastle verwendet wird, MS
für .NET-Klassen)
Schlüsselpaar erzeugen: privaten und öffentlichen Schlüssel
BC.IAsymmetricCipherKeyPairGenerator bcKpGen = BC.GeneratorUtilities.GetKeyPairGenerator("ECDSA");
bcKpGen.Init(new BC.ECKeyGenerationParameters(BC.SecObjectIdentifiers.SecP256r1, new BC.SecureRandom()));
BC.AsymmetricCipherKeyPair bcSubjKeys = bcKpGen.GenerateKeyPair();
Verwendung private Schlüssel um den öffentlichen Schlüssel mit einigen zusätzlichen Daten zu signieren (Betreff, Gültigkeitsdauer usw.)
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);
"Join" privater Schlüssel aus Schritt1 und Zertifikat aus Schritt2, um Zertifikat mit privatem Schlüssel zu erhalten.
Wenn ich mit Zertifikat ok bin ohne private Schlüssel, konnte ich so etwas wie:
MS.X509Certificate mcCert = new MS.X509Certificate2(bcCert.GetEncoded(), null);
und ich bin fertig.
Die Frage (n) kommen, wenn private Schlüssel zu setzen versucht:
msCert.PrivateKey = ConvertBouncyToNetSomehow(bcSubjKeys.Private)
(beachten Sie, dass typeof msCert.PrivateKey
ist MS.AsymmetricAlgorithm
und die Art der bcSubjKeys.Private
ist BC.ECPrivateKeyParameters
)
Es scheint, dass geeignete Weg ist, Verwendung MS.ECDsaCng
Klasse (die von MS.AsymmetricAlgorithm
erbt), aber:
die einzige Möglichkeit, f ound BC.ECPrivateKeyParameters
-MS.CngKey
(wird von MS.ECDsaCng
) über pkcs8-Format zu konvertieren:
BC.PrivateKeyInfo bcPKInfo = BC.PrivateKeyInfoFactory.CreatePrivateKeyInfo(bcSubjKeys.Private);
byte[] pkArr = bcPKInfo.GetDerEncoded();
MS.CngKey msPKCng = MS.CngKey.Import(pkArr, MS.CngKeyBlobFormat.Pkcs8PrivateBlob);
aber mit diesem Ansatz einige Informationen verloren gehen, weil Wert von msPKCng.AlgorithmGroup
ist "ECDH"
während bcSubjKeys.Private.AlgorithmName
"ECDSA"
sagt. Auch der ECDH-Schlüssel kann nicht mit MS.ECDsaCng
verwendet werden.
Dennoch .. konnte ich mit MS.ECDiffieHellmanCng
weiterhin statt angefordert von MS.ECDsaCng
wenn ..
Implementierung von MS.X509Certificate2.set_PrivateKey
erfordert das Objekt implementiert Schnittstelle MS.ICspAsymmetricAlgorithm
. Aber keiner von ihnen (ECDsaCng
, ECDiffieHellmanCng
) implementieren es.
An diesem Punkt scheint ein anderer Ansatz verwendet zu werden (wegen MS.ICspAsymmetricAlgorithm
Zustand), z. Exportieren Sie das Zertifikat und den privaten Schlüssel in die pkcs-Datei und verwenden Sie X509Certificate2.Import(..)
.
Irgendwelche Hinweise? Mit freundlichen Grüßen
Es hat nicht funktioniert :-(Irgendwelche Hinweise? @bartonjs Haben Sie ein laufendes Beispiel für .net 4.6.1/2 –
@DanielFisherlennybacon Sieht so aus, als hätte ich einen & -Fehler (und ein paar Tippfehler) PKCS8 Blob, der zu einem gültigen Cert-Blob gehört, https://gist.github.com/bartonjs/fac9ea9108dd184a7a66be77f0af3fef hat für mich gearbeitet – bartonjs
Ich werde es dir ansehen Danke im Voraus! –