Как получить закрытый ключ из отдельного файла? - PullRequest
2 голосов
/ 21 февраля 2012

У меня есть сервер Apache (xampp / wamp), который обеспечивает SSL-соединение через порт 443. Он использует два файла сертификатов: server.cert и server.key, когда последний содержит закрытый ключ.

Iдругой сервер настроен на прослушивание запросов через порт 843 (флэш-политики) и ответ на определенный запрос с некоторым текстовым ответом, написанным на C #, который выполняется отдельно.

Для достижения возможности подключения SSL я использую flexобъект под названием SecureSocket, который позволяет, однако, использовать оригинальный сертификат сервера для шифрования запроса.

Моя цель - научить мой сервер 843 C # расшифровывать отправленные данные и шифровать ответ, и для этого яЯ использую объект X509Certificate в C #.

Однако, поскольку ключи pub и priv находятся в разных файлах, я получаю FALSE в следующих случаях:

string text = System.IO.File.ReadAllText(@"C:\xampp\apache\conf\ssl.crt\server.crt");
UTF8Encoding encoding = new System.Text.UTF8Encoding();
byte[] byteCert = encoding.GetBytes(text);
X509Certificate2 uberCert = new X509Certificate2();
uberCert.Import(byteCert);
Console.WriteLine("Has privateKey:" + uberCert.HasPrivateKey.ToString());
Console.WriteLine("PrivateKey: \n" + uberCert.PrivateKey);

Очевидно, Falseна uberCert.HasPrivateKey происходит из-за того, что закрытый ключ находится в другом файле, поэтому мои вопросы:

1.Как я могу прочитать закрытый ключ, используя объект X509CErtificate2?2.Как я могу использовать открытый ключ для расшифровки полученного сообщения и как повторно зашифровать его с помощью закрытого ключа (чтобы отправить зашифрованный ответ обратно)?

Заранее спасибо,

Майк.

Ответы [ 3 ]

1 голос
/ 17 июля 2017

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

// 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-проект для функциональности и примеров кода.

0 голосов
/ 21 февраля 2012

Вы не можете напрямую .NET.

Вы можете либо использовать BouncyCastle (см. Этот ответ: Как прочитать закрытый ключ PEM RSA из .NET ), либо использовать PKCS12.контейнер вместо имени пользователя и пароля, который вы можете создать с помощью инструментов OpenSSL из файлов PEM.

0 голосов
/ 21 февраля 2012

Секретный ключ, вероятно, PEM-кодированный PKCS # 8 структура.

Проект Mono предоставляет код для чтения этого формата (среди прочего) в сборке Mono.Security.dll . Эта сборка является чисто управляемой и будет работать в Windows, Linux или OSX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...