0

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 証明書を信頼するにはどうすればよいですか?

4

1 に答える 1