web-dev-qa-db-ja.com

WebClient + HTTPSの問題

現在、サードパーティが作成したシステムと統合しています。このシステムでは、XML/HTTPSを使用してリクエストを送信する必要があります。サードパーティから証明書が送られてきて、インストールしました

私は次のコードを使用します:

using (WebClient client = new WebClient())
{
   client.Headers.Add(HttpRequestHeader.ContentType, "text/xml");

   System.Text.ASCIIEncoding  encoding=new System.Text.ASCIIEncoding();
   var response = client.UploadData(address, "POST", encoding.GetBytes(msg));
}

このコードは、次のWebExceptionを返します。

基礎となる接続が閉じられました:SSL/TLSセキュアチャネルの信頼関係を確立できませんでした。

[〜#〜] update [〜#〜]これはテストサーバーであるため、証明書は信頼されず、検証は失敗します。 。テスト/デバッグ環境でこれをバイパスするには、新しいServerCertificateValidationCallbackを作成します

ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(bypassAllCertificateStuff);

そして、ここに私の「フェイク」コールバックがあります

private static bool bypassAllCertificateStuff(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error)
{
   return true;
}

続きを読む here および here

62
rudigrobler

すべての証明書を許可するコードの最短表記は、実際には次のとおりです。

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

そして、このエラーに対してうまく機能します。言うまでもなく、実際に証明書をチェックし、通信が安全かどうかを証明書情報に基づいて決定する実装を提供する必要があります。テスト目的で、上記のコード行を使用します。

70
Koen Zomers

元の回答のVB.NETバージョンの場合は、ここに進みます( 'AddressOf'演算子でイベントを関連付ける必要がある場合、コンバーターはうまく機能しません)。 WebClient()またはHttpWebRequest()オブジェクトを使用する前の最初のコード:

ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf bypassAllCertificateStuff)

..そして配線されたメソッドコード:

Private Shared Function bypassAllCertificateStuff(ByVal sender As Object, ByVal cert As X509Certificate, ByVal chain As X509Chain, ByVal [error] As System.Net.Security.SslPolicyErrors) As Boolean
    Return True
End Function
8
atconway