web-dev-qa-db-ja.com

System.Net.WebRequestはSSL / TLSのどのバージョンをサポートしていますか?

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

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

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

75
JK.

System.Net.WebRequestを使用する場合、アプリケーションはサーバーとネゴシエートして、アプリケーションとサーバーの両方がサポートする最高のTLSバージョンを決定し、これを使用します。この仕組みの詳細については、こちらをご覧ください。

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

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

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

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

https://serverfault.com/questions/637207/on-iis-how-do-i-patch-the-ssl-3-0-poodle-vulnerability-cve-2014-3566

46
Gareth Williams

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

ブラウザでのプロトコルサポートを確認するための2つの優れたツールは、 SSL Labのクライアントテスト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");

結果はとんでもないです:

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

それは心配です。 2006年のInternet Explorer 7に匹敵します。

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 Framework 4.6.2を使用しています。 HttpClientはSSL 3とTLS 1.0のみをサポートしていることがわかりました。それは心配です。これは、2006年のInternet Explorer 7に匹敵します。


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

すぐに不正なプロトコルを使用する理由がわかりません。これは、主要なセキュリティバグと同等の、不適切なセットアップの選択のようです(多くのアプリケーションはデフォルトを変更しないと思います)。どうすれば報告できますか?

49
Colonel Panic

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

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