ECDSA kullanarak özel anahtarlı (kendinden imzalı) sertifika oluşturmaya çalışıyorum. gol openssl kullanırken olarak "aynı" (pkcs12) sertifikası elde etmektir:ECDSA kullanarak sertifika oluştur C#
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
Zaten az çok takip RSA tabanlı sertifika (lar) oluşturma ile öylesine sonraki adımları bana yardım BouncyCastle kullanmak
RSA certs oluşturmak için kullanıyorum.
BC.IAsymmetricCipherKeyPairGenerator bcKpGen = BC.GeneratorUtilities.GetKeyPairGenerator("ECDSA");
bcKpGen.Init(new BC.ECKeyGenerationParameters(BC.SecObjectIdentifiers.SecP256r1, new BC.SecureRandom()));
BC.AsymmetricCipherKeyPair bcSubjKeys = bcKpGen.GenerateKeyPair();
kullanımı özel anahtar, kamu ve özel anahtarlar:
anahtar çifti oluşturmak (BC
önek NET sınıfları için BouncyCastle, MS
gelen sınıfları için kullanılan dikkat edin) bazı ek verilerle genel anahtarı imzalamak için (konu, geçerlilik süresi vb.)
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);
Özel anahtarla sertifika almak için adım 1'den özel anahtarı ve adım 2'den sertifikaya katılın. Ben özel anahtar olmadan sertifika ile ok isem
, şöyle bir şey yapabilirsiniz:
MS.X509Certificate mcCert = new MS.X509Certificate2(bcCert.GetEncoded(), null);
ve ben bittim.
msCert.PrivateKey = ConvertBouncyToNetSomehow(bcSubjKeys.Private)
uygun bir yol gibi görünüyor
(typeof msCert.PrivateKey
MS.AsymmetricAlgorithm
ve bcSubjKeys.Private
tipi BC.ECPrivateKeyParameters
olduğuna dikkat edin): Özel anahtar ayarları yapmaya çalışırken
sorun (lar) gelip
tek yolu ettiğini göstermiştir: MS.ECDsaCng
(MS.AsymmetricAlgorithm
devralan) sınıfı, fakat ound pkcs8 biçimi aracılığıyla BC.ECPrivateKeyParameters
(MS.ECDsaCng
tarafından gerekli) MS.CngKey
etmektir dönüştürmek için:
BC.PrivateKeyInfo bcPKInfo = BC.PrivateKeyInfoFactory.CreatePrivateKeyInfo(bcSubjKeys.Private);
byte[] pkArr = bcPKInfo.GetDerEncoded();
MS.CngKey msPKCng = MS.CngKey.Import(pkArr, MS.CngKeyBlobFormat.Pkcs8PrivateBlob);
ama bcSubjKeys.Private.AlgorithmName
"ECDSA"
diyor ederken bazı bilgiler kaybolur bu yaklaşımı kullanarak msPKCng.AlgorithmGroup
değeri "ECDH"
çünkü. Ayrıca ECDH anahtarı MS.ECDsaCng
ile kullanılamaz.
Yine .. ben MS.X509Certificate2.set_PrivateKey
ait
uygulama nesne arayüzü MS.ICspAsymmetricAlgorithm
uygulayan gerektirir .. MS.ECDiffieHellmanCng
devam yerine MS.ECDsaCng
eğer talep olabilir. Ancak bunlardan hiçbiri (ECDsaCng
, ECDiffieHellmanCng
) onu uygulamamaktadır. Farklı bir yaklaşım görünen bu noktada
, örneğin (nedeniyle MS.ICspAsymmetricAlgorithm
durumun) kullanılmalıdır ihracat sertifikası ve özel anahtar pkcs dosyasına ve X509Certificate2.Import(..)
kullanın.
Herhangi bir ipucu? Saygılar
İşe yaramadı :-(Herhangi bir ipucu? @bartonjs Çalıştığınız bir örnek var .net 4.6.1/2 –
@DanielFisherlennybacon Bir & hata (ve bir çift yazım hatası) vardı gibi görünüyor. Geçerli bir geçerli Geçerli bir cert blob ait PKCS8 blob, https://gist.github.com/bartonjs/fac9ea9108dd184a7a66be77f0af3fef benim için çalıştı – bartonjs
Bir göz atacağım.Şimdiden teşekkürler! –