Свяжите закрытый ключ с классом X509Certificate2 в .net

Я работаю над некоторым кодом, который создает сертификат X509 и пару открытых/закрытых ключей. Открытый ключ добавляется в сертификат и отправляется в ЦС, который подписывает его.

Возвращенный сертификат затем открывается через класс System.Security.Cryptography.X509Certificates.X509Certificate2. Теперь я хочу использовать этот сертификат, чтобы инициировать безопасное соединение с другими клиентами. Поэтому я использую класс SslStream. Чтобы запустить SSL-квитирование, я использую этот метод:

server.AssociatedSslStream.AuthenticateAsServer(
                        MyCertificate,                      // Client Certificate
                        true,                               // Require Certificate from connecting Peer
                        SslProtocols.Tls,                   // Use TLS 1.0
                        false                               // check Certificate revocation
                    );

Этот метод требует, чтобы закрытый ключ был связан с сертификатом. Конечно, сертификат, возвращенный ЦС, не содержит закрытого ключа. Но он хранится как .key файл на жестком диске. Класс X509Certificate2 имеет свойство PrivateKey, которое, я думаю, свяжет закрытый ключ с сертификатом, но я не могу найти способ установить это свойство.

Можно ли каким-либо образом связать закрытый ключ с классом .net X509?

Ответ 1

Для всех остальных с той же проблемой я нашел аккуратный кусочек кода, который позволяет делать именно это:

http://www.codeproject.com/Articles/162194/Certificates-to-DB-and-Back

byte[] certBuffer = Helpers.GetBytesFromPEM(publicCert, PemStringType.Certificate);
byte[] keyBuffer  = Helpers.GetBytesFromPEM(privateKey, PemStringType.RsaPrivateKey);

X509Certificate2 certificate = new X509Certificate2(certBuffer, password);

RSACryptoServiceProvider prov = Crypto.DecodeRsaPrivateKey(keyBuffer);
certificate.PrivateKey = prov;

Ответ 2

Вы можете избавить себя от необходимости копировать все эти коды и хранить закрытый ключ рядом с сертификатом в файле pfx/pkcs#12:

openssl pkcs12 -export -in my.cer -inkey my.key -out mycert.pfx

Вам нужно будет предоставить пароль, который вы должны передать конструктору X509Certificate2:

X509Certificate2 cert = new X509Certificate2("mycert.pfx","password");