Свяжите закрытый ключ с классом 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");