System.Net.WebRequestがサポートするSSL / TLSのバージョンはどれですか?


81

SSL 3は、POODLE攻撃に対して脆弱であることが判明しました。

httpsUriに接続するときにSystem.Net.WebRequestが使用するSSL / TLSのバージョンはどれですか?

WebRequestを使用していくつかのサードパーティAPIに接続します。これらの1つは、SSL 3を使用するすべての要求をブロックすると述べています。ただし、WebRequestは.Netコアフレームワーク(4.5を使用)の一部であるため、使用するバージョンが明確ではありません。


サーバー(または中間者)が要求した場合、WebRequestはSSL 3にフォールバックしますか?
フィリップピトル2014年

私が間違っていなければ、WebRequestは、プルアップしようとしているサーバー上のセキュリティ証明書を調べて、Webサーバー上にある暗号化スキーマを使用すると思います。クライアント側で何も変更する必要はないと思います。
icemanind 2014年

1
私はちょうど彼らが作ると考えられてきたSSL3をサポートしていないと述べているAPIの所有者は必ずそのサーバがクライアントの利用SSL3 :)ことを要求していないことを望んでいるだろう
JK。

@icemanは、SSL3をサポートしているかどうかを証明書から判断する方法はありますか?バージョンに関連するプロパティが表示されません。
JK。

@JK。-他のブラウザについてはよくわかりませんが、Chromeを使用しています。Chromeでは、HTTPS Webサイト(Wellsfargo.comなど)にアクセスすると、URLの近くに緑色のロックが表示されます。そのロックをクリックしてから、[接続]タブをクリックすると、表示されます。wellsfargo.comの場合、Chromeは「接続はTLS1.0を使用しています」と表示します。IEと他のブラウザは同じようなものを表示するはずです。
Icemanind 2014年

回答:


51

System.Net.WebRequestを使用する場合、アプリケーションはサーバーとネゴシエートして、アプリケーションとサーバーの両方がサポートする最高のTLSバージョンを決定し、これを使用します。これがどのように機能するかについての詳細は、ここで確認できます。

http://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_handshake

サーバーがTLSをサポートしていない場合、サーバーはSSLにフォールバックするため、SSL3にフォールバックする可能性があります。.NET4.5がサポートするすべてのバージョンをここで確認できます。

http://msdn.microsoft.com/en-us/library/system.security.authentication.sslprotocols(v=vs.110).aspx

アプリケーションがPOODLEに対して脆弱になるのを防ぐために、次の説明に従って、アプリケーションが実行されているマシンでSSL3を無効にすることができます。

/server/637207/on-iis-how-do-i-patch-the-ssl-3-0-poodle-vulnerability-cve-2014-3566


20
私が作ることを示唆しているアウトバウンドで私の質問で説明するように、あなたが無効にSSLフォールバックの手順に従ってください、WebRequestクラスおよびHttpWebRequestの安全などの要求をstackoverflow.com/questions/26389899/...。基本的に、最初に次のコード行を実行します。System.Net.ServicePointManager.SecurityProtocol= SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 私が理解しているように、この回答で詳述されているレジストリの修正は、インバウンド接続にのみ適用されます。
ジョーダンリーガー2015

1
SecurityProtocolType.Tls.net Framework 3.5以下ではオプション(したがってTLS 1.0)しか使用できないことに注意してください
James Westgate

System.Net.WebRequestを破棄し、RestSharpなどの別のライブラリを使用することでより高いTLSサポートを取得できますか、それともアップグレードが必要なのは実際の.netフレームワークですか?
マフィンマン

これは、アップグレードが必要な実際の.netフレームワークだと思います。www.passionatecoder.ca
Ehsan

1
@JamesWestgate TLSOS /マシンレベルで実際に実装されるような印象を受けましたか?それは実際のHTTPトラフィックが発生している場所ではありませんか?したがって、OSによって実際に決定される特定のTLSを使用するようにコードに指示しようとするのは意味がないと思います。
ドンチードル2016年

52

これは重要な質問です。SSL 3プロトコル(1996)は、2014年に公開されたPoodle攻撃によって取り返しのつかないほど壊れています。IETFは「SSLv3を使用してはならない」を公​​開しています。Webブラウザはそれを捨てています。MozillaFirefoxGoogleChromeはすでにそうしています。

ブラウザでプロトコルサポートをチェックするための2つの優れたツールは、SSLLabのクライアントテストhttps://www.howsmyssl.com/です。後者はJavascriptを必要としないので、.NETのHttpClientから試すことができます

// set proxy if you need to
// WebRequest.DefaultWebProxy = new WebProxy("http://localhost:3128");

File.WriteAllText("howsmyssl-httpclient.html", new HttpClient().GetStringAsync("https://www.howsmyssl.com").Result);

// alternative using WebClient for older framework versions
// new WebClient().DownloadFile("https://www.howsmyssl.com/", "howsmyssl-webclient.html");

結果はひどいです:

クライアントはTLS1.0を使用していますが、これは非常に古く、BEAST攻撃の影響を受けやすい可能性があり、利用可能な最高の暗号スイートがありません。MD5-SHA-1を置き換えるAES-GCMやSHA256などの追加機能は、TLS1.0クライアントやより多くの最新の暗号スイートでは使用できません。

それが心配です。2006年のInternetExplorer7に匹敵します。

HTTPクライアントがサポートするプロトコルを正確に一覧表示するには、以下のバージョン固有のテストサーバーを試すことができます。

var test_servers = new Dictionary<string, string>();
test_servers["SSL 2"] = "https://www.ssllabs.com:10200";
test_servers["SSL 3"] = "https://www.ssllabs.com:10300";
test_servers["TLS 1.0"] = "https://www.ssllabs.com:10301";
test_servers["TLS 1.1"] = "https://www.ssllabs.com:10302";
test_servers["TLS 1.2"] = "https://www.ssllabs.com:10303";

var supported = new Func<string, bool>(url =>
{
    try { return new HttpClient().GetAsync(url).Result.IsSuccessStatusCode; }
    catch { return false; }
});

var supported_protocols = test_servers.Where(server => supported(server.Value));
Console.WriteLine(string.Join(", ", supported_protocols.Select(x => x.Key)));

.NET Framework4.6.2を使用しています。HttpClientはSSL3とTLS1.0のみをサポートしていることがわかりました。それが心配です。これは、2006年のInternet Explorer7に相当します。


更新: HttpClientはTLS 1.1および1.2をサポートするようになりますが、で手動でオンにする必要がありSystem.Net.ServicePointManager.SecurityProtocolます。https://stackoverflow.com/a/26392698/284795を参照してください

なぜそれがすぐに悪いプロトコルを使用するのか分かりません。これはセットアップの選択としては不適切なようで、重大なセキュリティバグに相当します(多くのアプリケーションがデフォルトを変更しないに違いありません)。どうすれば報告できますか?


どのプロトコル を使用する必要がありますか?
kiquenet 2018

8

私もそこに答えを入れましたが、@ Colonel Panicの更新の記事は、TLS1.2を強制することを示唆しています。将来、TLS 1.2が危険にさらされたり、置き換えられたりした場合、コードをTLS1.2に固執させることは欠陥と見なされます。TLS1.2へのネゴシエーションは、デフォルトで.Net4.6で有効になっています。ソースを.Net4.6にアップグレードするオプションがある場合は、TLS1.2を強制的に切り替えることを強くお勧めします。

TLS 1.2を強制する場合は、4.6以降のフレームワークにアップグレードする場合にその強制を削除する、ある種のブレッドクラムを残すことを強く検討してください。


2
「TLS1.2へのネゴシエーションはデフォルトで.Net4.6で有効になっています」これに関するドキュメントはありますか?
felickz 2016年

2
当時、この機能を示唆する決定的なドキュメントは見つかりませんでした(例のすぐ上にあるmsdn.microsoft.com/en-us/library/…を参照)。ただし、TLS 1.2にロックダウンされたサーバーでテストプログラムを作成し、Webリクエストを使用してページをダウンロードすることで、これを確認しました。次に、プログラムのフレームワークバージョンを変更しました。すべてのダウンレベルバージョンは接続に失敗しましたが、.Net4.6は問題なく接続されました。
フォンレモンガーグル教授2016

詳細のおかげで、4.5がTLS 1.2に接続しないことを指摘する多くのAPIプロバイダーが表示されますが、公式ドキュメントを提供するのに苦労し、コミュニティに依存する必要がありました:)
felickz 2016

これは正しいことであり、進むべき道です。現在TLSを要求しているWebエンドポイントと通信している古いサーバーがいくつかあります。Webサービス参照がSSL / TLSエラーで失敗し始めました。レジストリをハッキングすることはできますが、サーバーを最新の.NETバージョンにアップグレードする方が簡単で安全です。
Neil Laslett 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.