Проблема с pfx d BouncyCastle
От: Аноним  
Дата: 19.12.13 17:31
Оценка:
Нашел в гугле вот такой простой и обыденный пример:

        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) сохранить в файли потом закинуть в хранилище, в результате получил ожидаемый результат, а именно сертификат не содержит закрытого ключа!!!
Re: Проблема с pfx d BouncyCastle
От: SanyaVB  
Дата: 19.12.13 18:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нашел в гугле вот такой простой и обыденный пример:


А>
А>        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);
Re[2]: Проблема с pfx d BouncyCastle
От: Аноним  
Дата: 19.12.13 19:10
Оценка:
Здравствуйте, 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


Может я как то не так экспортирую ключ???? Помогите пожалуйста
Re[3]: Проблема с pfx d BouncyCastle
От: Аноним  
Дата: 20.12.13 13:22
Оценка:
Решил проблему, оказалось если не экспортировать полученный сертификат, а сразу сохранять в хранилище, то закрытый ключ не исчезает.

Ребят, а можете подcказать как используя BouncyCastle.Crypto.dll сделать аналог флага: makecert.exe -sky exchange
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.