2013-08-26 9 views
2

Я работаю над некоторым кодом, который в настоящее время использует OpenSSL.net для создания пары открытых/закрытых ключей для запроса подписи сертификата. Запрос снабжен открытым ключом и отправляется в ЦС, который возвращает подписанный сертификат. Затем ранее созданный секретный ключ добавляется к сертификату:Добавить закрытый ключ в X509Certificate

myCert.PrivateKey = CryptoKey.FromPrivateKey(rsa.PrivateKeyAsPEM, null); 

Проблема в том, мне нужен .net X509Certificate, потому что остальная часть программного обеспечения использует SslStream и других классов .NET для TLS.

Мне удалось создать сертификат из ответа CA, но я не нашел способ добавить к нему закрытый ключ. Я также попытался создать сертификат OpenSSL из ответа CA, экспортируя его как DER или PEM и создав сертификат .net, но он всегда игнорирует закрытый ключ.

Любые идеи о том, как я могу решить эту проблему?

+0

Неужели это когда-нибудь разрешилось? У меня такая же проблема. –

+2

Да, я сделал: http://stackoverflow.com/questions/18462064/associate-a-private-key-with-the-x509certificate2-class-in-net – PogoMips

+0

Nice. После публикации здесь я в конечном итоге смог разобраться. Мой подход был немного более ручным. Но вот оно. http://stackoverflow.com/questions/243646/how-to-read-a-pem-rsa-private-key-from-net/19579157#19579157 –

ответ

0

Возможно, вам не хватает концептуальных идей здесь?

Сертификат не должен содержать закрытый ключ. Частный ключ всегда является приватным, сертификат - это то, что связывает ваш открытый ключ с вашим выдающимся именем. Другими словами, сертификат - это документ, который подписывается органом, который подтверждает, что для вас и никого не принадлежит конкретный открытый ключ, который вы разделяете с миром. Поэтому он никогда не может содержать закрытый ключ, потому что вы делитесь своим сертификатом с миром!

+0

Ну, правда, это имеет смысл. Но потом я все еще задаюсь вопросом о двух вещах: 1. Почему в OpenSSL можно добавить закрытый ключ к сертификату? 2. Если у сертификатов не должно быть закрытых ключей, что означает это исключение? брошенный «AuthenticateAsServer()»: System.NotSupportedException: Режим сервера SSL должен использовать сертификат с соответствующим закрытым ключом – PogoMips

+0

Это невозможно. Возможно, их терминология неаккуратная, но возможно создание * файла *, содержащего как закрытый ключ, так и сертификат. Я не вижу ничего сложного в понимании «сертификата» с * связанным личным ключом. Он ничего не говорит о том, что ключ находится внутри. – EJP

+0

Хорошо, тогда вы можете дать мне несколько советов о том, как я могу связать закрытый ключ с сертификатом в .net? У меня есть закрытый ключ, который создается с помощью OpenSSL и сохраняется на диске в файле .key. в OpenSSL можно просто вызвать cert.PrivateKey = Key, но поскольку нет документации для оберток .net, я не знаю, что она делает. По-видимому, он не добавляет его в сертификат. – PogoMips

2

Я создал небольшой вспомогательный NuGet пакет для создания сертификата X509 на основе на открытых ключ и частного (РКА) ключ.

// Generate with: openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout private.key -out certificate_pub.crt 
string certificateText = File.ReadAllText("certificate_pub.crt"); 
string privateKeyText = File.ReadAllText("private.key"); 

ICertificateProvider provider = new CertificateFromFileProvider(certificateText, privateKeyText); 
X509Certificate2 certificate = provider.Certificate; 

// Example: use the PrivateKey from the certificate above for signing a JWT token using Jose.Jwt: 
string token = Jose.JWT.Encode(payload, certificate.PrivateKey, JwsAlgorithm.RS256); 

См NuGet и Github-project для функциональности и кодовых примеров, основанных на opensslkey.

Смежные вопросы