HTTPS(SSL通信)でのオレオレ証明書エラー(信頼関係を確立できませんでした...)への対処

System.Net.WebClientなどで通信を行うとき、信頼できない証明書(localhostとか)の場合、

"基礎になる接続が閉じられました: SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立できませんでした"

といった例外エラーが発生する。
匿名メソッドを使って記述した回避方法は、以下の通り。

// リクエストを投げる前に行う
if (System.Net.ServicePointManager.ServerCertificateValidationCallback == null){
System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate(Object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) {
return true; // 無条件でオレオレ証明を信用する。危険!(senderのURIとか調べてチェックすべし!)
};
}

匿名メソッドを使わない場合には、次のようになる。

// リクエストを投げる前に行う
if (System.Net.ServicePointManager.ServerCertificateValidationCallback == null){
System.Net.ServicePointManager.ServerCertificateValidationCallback +=new System.Net.Security.RemoteCertificateValidationCallback(OnRemoteCertificateValidationCallback);
}

// URIやら内容を細かくチェックしたい場合にはこのように独立して記述したほうがわかりやすいかも
private static bool OnRemoteCertificateValidationCallback(Object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate,
System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) {
return true; // 無条件でオレオレ証明を信用する。危険!(senderのURIとか調
}

ところでforループの中で使う匿名メソッドが共通になるかどうかはなかなか奥が深そう。
もうちょっと調査する必要あり。

MEMO(81597)