SSL 3は、POODLE攻撃に対して脆弱であることが判明しました。
httpsUriに接続するときにSystem.Net.WebRequestが使用するSSL / TLSのバージョンはどれですか?
WebRequestを使用していくつかのサードパーティAPIに接続します。これらの1つは、SSL 3を使用するすべての要求をブロックすると述べています。ただし、WebRequestは.Netコアフレームワーク(4.5を使用)の一部であるため、使用するバージョンが明確ではありません。
SSL 3は、POODLE攻撃に対して脆弱であることが判明しました。
httpsUriに接続するときにSystem.Net.WebRequestが使用するSSL / TLSのバージョンはどれですか?
WebRequestを使用していくつかのサードパーティAPIに接続します。これらの1つは、SSL 3を使用するすべての要求をブロックすると述べています。ただし、WebRequestは.Netコアフレームワーク(4.5を使用)の一部であるため、使用するバージョンが明確ではありません。
回答:
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
SecurityProtocolType.Tls
.net Framework 3.5以下ではオプション(したがってTLS 1.0)しか使用できないことに注意してください
TLS
OS /マシンレベルで実際に実装されるような印象を受けましたか?それは実際のHTTPトラフィックが発生している場所ではありませんか?したがって、OSによって実際に決定される特定のTLSを使用するようにコードに指示しようとするのは意味がないと思います。
これは重要な質問です。SSL 3プロトコル(1996)は、2014年に公開されたPoodle攻撃によって取り返しのつかないほど壊れています。IETFは「SSLv3を使用してはならない」を公開しています。Webブラウザはそれを捨てています。MozillaFirefoxとGoogleChromeはすでにそうしています。
ブラウザでプロトコルサポートをチェックするための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を参照してください
なぜそれがすぐに悪いプロトコルを使用するのか分かりません。これはセットアップの選択としては不適切なようで、重大なセキュリティバグに相当します(多くのアプリケーションがデフォルトを変更しないに違いありません)。どうすれば報告できますか?
私もそこに答えを入れましたが、@ Colonel Panicの更新の記事は、TLS1.2を強制することを示唆しています。将来、TLS 1.2が危険にさらされたり、置き換えられたりした場合、コードをTLS1.2に固執させることは欠陥と見なされます。TLS1.2へのネゴシエーションは、デフォルトで.Net4.6で有効になっています。ソースを.Net4.6にアップグレードするオプションがある場合は、TLS1.2を強制的に切り替えることを強くお勧めします。
TLS 1.2を強制する場合は、4.6以降のフレームワークにアップグレードする場合にその強制を削除する、ある種のブレッドクラムを残すことを強く検討してください。