Использование System.Net.WebClient с сертификатом HTTPS - PullRequest
12 голосов
/ 13 сентября 2011

В моем клиенте C # для 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:

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

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

Ответы [ 4 ]

11 голосов
/ 13 сентября 2011

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

4 голосов
/ 13 сентября 2011

Клиент сертификаты будут работать только , если доступен закрытый ключ.Это не , как правило, в случае использования файлов .cer, поскольку сертификат X.509 не включает закрытый ключ.

Единственный безопасный способ обеспечить доступ к закрытому ключу - это загрузить сертификат из файла PKCS # 12, в котором доступны оба сертификата (ов) и закрытый ключ (т.е. оба были экспортированы в файл .pfx )..

Примечания:

  • Я сказал обычно , потому что Windows / CryptoAPI иногда делает магию (при использовании с сертификатом X509)и автоматически связывать сертификат с закрытым ключом из хранилища certificate.key.

  • Я сказал safe , потому что это будет работать и на Mono, а не только на MS .NET.

1 голос
/ 13 сентября 2011

Звучит так, будто вы делаете это задом наперед. У вас должен быть установлен сертификат SLL на веб-хосте / сервере. Затем вы создаете веб-запрос к веб-серверу и требует протокол HTTPS.

0 голосов
/ 06 ноября 2012

Просто подключитесь к вашему серверу с RDP

Откройте IE и перейдите в Свойства обозревателя

Перейдите на вкладку «Дополнительно» и включите «Использовать SSL 2.0 и SSL 3.0

».

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

...