WebClient を使用して HTTPS 経由で Web サービスからデータをダウンロードする小さな C# アプリがあります (URL は https:// で始まります)。以下は、長い間うまく機能しています。
public class WebClientEx : WebClient {
public int Timeout {get; set;}
protected override WebRequest GetWebRequest(Uri address) {
var request = base.GetWebRequest(address);
if (request != null)
request.Timeout = Timeout;
return request;
}
}
using (var client = new WebClientEx()) {
client.Proxy = new WebProxy(ProxyUrl) { Credentials = CredentialCache.DefaultCredentials };
client.Timeout = 900000;
var fields = new NameValueCollection { /* .... */ };
byte[] respBytes = client.UploadValues(url, fields);
/* .... */
}
ただし、Web サービスのプロバイダーが最近 SSL 証明書を更新したため、次のようになりました。
基になる接続が閉じられました: SSL/TLS セキュア チャネルの信頼関係を確立できませんでした。
SSL検証を無効にして「機能させる」ことができます:
public class WebClientEx : WebClient {
public int Timeout {get; set;}
protected override WebRequest GetWebRequest(Uri address) {
var request = base.GetWebRequest(address);
if (request != null)
request.Timeout = Timeout;
if (SSLCheckDisabled) {
try {
//Change SSL checks so that all checks pass
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
}
catch {
}
}
return request;
}
}
しかし、明白な理由から、私はこれをしたくありません!
Windows 7 + IE9 では、証明書は問題なく、IE で完全に信頼されています。.NET Framework 4.0 WebClient を使用して Web サービスにアクセスする Windows 2003 サーバーでは、IE6 はセキュリティ アラートで次のように述べています。
セキュリティ証明書は、信頼することを選択していない会社によって発行されました。証明書を表示して、認証機関を信頼するかどうかを判断します。
「信頼されていない」チェーンの最後の証明書は次のとおりです。
発行先: DigiCert 高保証 EV ルート CA
発行者: DigiCert High Assurance EV Root CA
このトラブルシューティング ページの上部には、「このパスのルート証明書は、DigiCert High-Assurance EV Root CA というタイトルで、最新のすべてのブラウザーによって既に信頼されています。」と記載されています。テストすると、すべてのオンライン SSL チェッカーがドメインをパスします。
私の質問は、WebClient を IE6 よりも IE9 のように動作させ、このクロス署名 SSL 証明書を信頼するにはどうすればよいですか?