Подтвердить что ты не робот

Использование 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:

Квитирование не удалось из-за неожиданного формата пакета.

Любое понимание того, что я делаю неправильно?

4b9b3361

Ответ 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

Теперь ваши запросы на сервер будут аутентифицированы