Использование System.Net.WebClient с сертификатом HTTPS
В моем клиенте Windows С# у меня есть сообщение POST для "Mothership". Я хочу, чтобы данные в сообщениях были защищены, конечно, поэтому я заплатил за HostGator за выдачу мне сертификата SSL.
Я сохранил файл .CER, и я создаю запрос как таковой:
//wrapper for WebClient object to use certificate file
class SecureWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
string certPath = @"e:\mycertificate.cer";
X509Certificate myCert = X509Certificate.CreateFromCertFile(certPath);
request.ClientCertificates.Add(myCert);
return request;
}
}
//request
private static SecureWebClient client = new SecureWebClient();
private static NameValueCollection = new NameValueCollection();
nvc.Add(POST_ACTION, ACTION_CODE_LOGIN);
nvc.Add(POST_EMAIL, email);
nvc.Add(POST_PASSWORD, password);
sResponse = System.Text.Encoding.ASCII.GetString(client.UploadValues(BASE_URL + ACTION_PAGE, nvc));
Он бросает System.Net.WebException:
Подключенное соединение было закрыто: при отправке произошла непредвиденная ошибка.
InnerException - это System.IO.IOException:
Квитирование не удалось из-за неожиданного формата пакета.
Любое понимание того, что я делаю неправильно?
Ответы
Ответ 1
Если вы используете не, используя сертификаты клиента, а можете получить доступ к вашему серверу с помощью https://, то ваш код должен выглядеть так:
private static WebClient client = new WebClient();
private static NameValueCollection nvc= new NameValueCollection();
nvc.Add(POST_ACTION, ACTION_CODE_LOGIN);
nvc.Add(POST_EMAIL, email);
nvc.Add(POST_PASSWORD, password);
sResponse = System.Text.Encoding.ASCII.GetString(client.UploadValues(BASE_URL + ACTION_PAGE, nvc));
Пока ваш BASE_URL использует https://, тогда все данные (от сервера и от сервера) будут зашифрованы.
IOW с использованием SSL/TLS от клиента к серверу не требует от клиента делать что-либо специальное (с сертификатом), помимо использования https:// в качестве схемы, поскольку операционная система предоставляет все (например, доверенные корни), необходимые для обеспечения передачи данных.
Ответ 2
Клиент сертификаты будут работать только, если доступен закрытый ключ. Обычно это не относится к использованию файлов .cer, поскольку сертификат X.509 содержит не закрытый ключ.
Единственный безопасный способ обеспечить доступ к секретному ключу - загрузить сертификат из файла PKCS # 12, где доступны как сертификат (ы), так и закрытый ключ (т.е. оба они были экспортированы в .pfx).
Примечания:
-
Я сказал обычно, потому что Windows/CryptoAPI иногда делает некоторые магии (при использовании с X509Certificate) и автоматически связывает сертификат с закрытым ключом из хранилищ сертификата.
-
Я сказал безопасный, потому что это будет работать и на Mono, а не только на MS.NET.
Ответ 3
Похоже, вы делаете это назад. У вас должен быть установлен сертификат SLL на веб-хосте/сервере. Затем вы создаете веб-запрос на веб-сервер и требуете протокол HTTPS.
Ответ 4
Просто подключитесь к вашему серверу с помощью RDP
Откройте IE и перейдите в "Свойства обозревателя"
Перейдите на вкладку "Дополнительно" и включите оба варианта использования SSL 2.0 и SSL 3.0
Теперь ваши запросы на сервер будут аутентифицированы