Нашел в гугле вот такой простой и обыденный пример:
static X509Certificate2 GenerateCertificate(string certName)
{
var keypairgen = new RsaKeyPairGenerator();
keypairgen.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024));
var keypair = keypairgen.GenerateKeyPair();
var gen = new X509V3CertificateGenerator();
var CN = new X509Name("CN=" + certName);
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("MD5WithRSA");
gen.SetPublicKey(keypair.Public);
var newCert = gen.Generate(keypair.Private);
return new X509Certificate2(DotNetUtilities.ToX509Certificate((Org.BouncyCastle.X509.X509Certificate)newCert));
}
Но к моему удивление
GenerateCertificate("X509").HasPrivateKey возвращает
false!!!!!
Как же можно создать сертификат с закрытым и открытым ключом???? а точнее pfx файл.
Попробовал массив
GenerateCertificate("X509").Export(X509ContentType.Pfx) сохранить в файли потом закинуть в хранилище, в результате получил ожидаемый результат, а именно сертификат не содержит закрытого ключа!!!
Здравствуйте, Аноним, Вы писали:
А>Нашел в гугле вот такой простой и обыденный пример:
А>А> static X509Certificate2 GenerateCertificate(string certName)
А> {
А> var keypairgen = new RsaKeyPairGenerator();
А> keypairgen.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024));
А> var keypair = keypairgen.GenerateKeyPair();
А> var gen = new X509V3CertificateGenerator();
А> var CN = new X509Name("CN=" + certName);
А> 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("MD5WithRSA");
А> gen.SetPublicKey(keypair.Public);
А> var newCert = gen.Generate(keypair.Private);
А> return new X509Certificate2(DotNetUtilities.ToX509Certificate((Org.BouncyCastle.X509.X509Certificate)newCert));
А> }
А>
А>Но к моему удивление GenerateCertificate("X509").HasPrivateKey возвращает false!!!!!
А>Как же можно создать сертификат с закрытым и открытым ключом???? а точнее pfx файл.
А>Попробовал массив GenerateCertificate("X509").Export(X509ContentType.Pfx) сохранить в файли потом закинуть в хранилище, в результате получил ожидаемый результат, а именно сертификат не содержит закрытого ключа!!!
А если дописать так?
var cert= new X509Certificate2(DotNetUtilities.ToX509Certificate((Org.BouncyCastle.X509.X509Certificate)newCert));
cert.PrivateKey = DotNetUtilities.ToRSA(keypair.Private as RsaPrivateCrtKeyParameters);
Здравствуйте, SanyaVB, Вы писали:
SVB>А если дописать так?
SVB>SVB>var cert= new X509Certificate2(DotNetUtilities.ToX509Certificate((Org.BouncyCastle.X509.X509Certificate)newCert));
SVB>cert.PrivateKey = DotNetUtilities.ToRSA(keypair.Private as RsaPrivateCrtKeyParameters);
SVB>
Да, действительно теперь закрытый ключ виден
, но есть ньюанс. см. ниже в коде
static X509Certificate2 GenerateCertificate(string certName)
{
var keypairgen = new RsaKeyPairGenerator();
keypairgen.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024));
var keypair = keypairgen.GenerateKeyPair();
var gen = new X509V3CertificateGenerator();
var CN = new X509Name("CN=" + certName);
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("MD5WithRSA");
gen.SetPublicKey(keypair.Public);
var newCert = gen.Generate(keypair.Private);
var cert = new X509Certificate2(DotNetUtilities.ToX509Certificate((Org.BouncyCastle.X509.X509Certificate)newCert));
cert.PrivateKey = DotNetUtilities.ToRSA(keypair.Private as RsaPrivateCrtKeyParameters);
return cert;
}
static void Main(string[] args)
{
X509Certificate2 cert1 = GenerateCertificate("X509");
Console.WriteLine(cert1.HasPrivateKey); // Теперь тут true
X509Certificate2 cert2 = new X509Certificate2(cert1.Export(X509ContentType.Pfx));
Console.WriteLine(cert2.HasPrivateKey); // а после экспорта false
}
//true
//false
Может я как то не так экспортирую ключ???? Помогите пожалуйста
Решил проблему, оказалось если не экспортировать полученный сертификат, а сразу сохранять в хранилище, то закрытый ключ не исчезает.
Ребят, а можете подcказать как используя
BouncyCastle.Crypto.dll сделать аналог флага: makecert.exe -sky exchange