WebRequestを使用して、httpsを使用してSSL暗号化サイトにアクセスするにはどうすればよいですか?


116

ユーザーが指定したURLからコンテンツを読み取るプログラムを書いています。私の問題は次のようなコードにあります:

Uri uri = new Uri(url);
WebRequest webRequest = WebRequest.Create(uri);
WebResponse webResponse = webRequest.GetResponse();
ReadFrom(webResponse.GetResponseStream());

そして、これは、提供されたURLが「https://」のURLである場合は機能しません。SSLで暗号化されたコンテンツで動作するように、このコードを変更するのを手伝ってくれる人はいますか?ありがとう。

回答:


175

正しい方法で行っていますが、ユーザーは無効なSSL証明書がインストールされているサイトにURLを提供している可能性があります。実際のWebリクエストを行う前にこの行を入力すると、これらの証明書の問題を無視できます。

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);

どこAcceptAllCertificationsで定義されます

public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    return true;
}

41
この回答をありがとう!不要なコードを回避するために、次のように使用しました。ServicePointManager.ServerCertificateValidationCallback =(s、cert、chain、ssl)=> true;
Charles Ouellet、2011年

4
ありがとう、あなたは私を助けてくれました。F#はこれをとても簡単にします:ServicePointManager.ServerCertificateValidationCallback <- Security.RemoteCertificateValidationCallback (fun _ _ _ _ -> true)
David Grenier

2
@Charles Ouellet私はあなたよりも怠惰だと思います、(a、b、c、d)=> true
Despertar

24
私が好む+= delegate { return true; }
vkrzv 2012

2
このアプローチに関連する潜在的なリスクに注意してください。詳細については、stackoverflow.com / a / 6613434/2969615を参照してください。
Joe Coyle、2018年

19

このリンクはあなたに興味があります:http : //msdn.microsoft.com/en-us/library/ds8bxk2a.aspx

HTTP接続の場合、WebRequestクラスとWebResponseクラスはSSLを使用して、SSLをサポートするWebホストと通信します。SSLを使用するかどうかの決定は、指定されたURIに基づいて、WebRequestクラスによって行われます。URIが「https:」で始まる場合、SSLが使用されます。URIが「http:」で始まる場合、暗号化されていない接続が使用されます。


素晴らしいリンク。それは重要な違いです。
DanM7、2015

1
あなたの答えは、質問のコードが機能することを意味しますか?
Rowland Shaw

18

これは私のために働きました:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

1
デフォルト値は「Ssl2 | Tls」です。サーバーでTls 1.1と1.2のみを有効にしていました。これで実際に問題が解決しました!LinuxでnginXを使用したLetsEncryptの場合、プロトコルは次のように定義されます:/etc/letsencrypt/options-ssl-nginx.conf
Jerther

これは別の問題を扱っていると思います。これは無効な証明書ではなく、より高いTLSバージョンに関するものです。
wp78de

「既存の接続がリモートホストによって強制的に閉じられました」という
メッセージが表示さ

これはグローバル設定であるため、リクエストを設定するたびに行う必要はなく、1回だけ行う必要があります。
チャドヘッジコック

どういうわけか単一のリクエストに対してこれを行うことができますか?ServicePointManagerはかなりグローバルなもののようです...
wexman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.