2012-02-21 4 views
1

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

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

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

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

Однако, так как паб и собств ключи находятся на разных файлах, я получаю 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); 

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

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

Заранее благодарен,

Mike.

ответ

0

Закрытый ключ PEM encodedPKCS#8 описание товара структура.

Проект Mono предоставляет код для чтения format (среди прочих) в сборке Mono.Security.dll. Эта сборка полностью управляется и будет работать в Windows, Linux или OSX.

0

Вы не можете прямо в .NET.

Вы можете использовать BouncyCastle (см. Этот ответ: How to read a PEM RSA private key from .NET) или использовать контейнер PKCS12 вместо имени пользователя + пароль, который вы можете создать с помощью инструментов OpenSSL из файлов PEM.

+0

Привет @Joe, Я сделал следующее: 'X509Certificate2 uberCert = новый X509Certificate2 (@ "C: \ XAMPP \ Apache \ конф \ server.pfx", "qwe123", X509KeyStorageFlags.MachineKeySet);' после объединения оба ключа в один файл pfx с помощью openssl. Он отвечает истинным, если я проверяю, существует ли закрытый ключ, но я не знаю, как его использовать, чтобы расшифровать мои запросы, не закодированные Base64. При использовании ссылки, которую вы предоставили, все, что я получаю, являются исключениями. какие-нибудь советы? – silicakes

0

Я создал небольшой вспомогательный NuGet пакет (на основе opensslkey), чтобы создать сертификат 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 для функциональности и кодовых примеров.

+1

wow awesome! прошло уже 5 лет :) – silicakes

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