1. ホーム
  2. c#

[解決済み] ServerCertificateValidationCallbackを設定しても、SSL/TLSセキュアチャネルを作成できない。

2023-02-23 05:54:08

質問

私は、SSL/TLS 接続を確立して 自己署名証明書を持つテストサーバ . 非セキュアなチャネルでの通信は問題なく動作しました。

この解決策を元に書いた私のサンプルコードです。 HttpClient で信頼できない SSL 証明書を使用できるようにする C# 証明書エラーを無視する? .NETクライアントからssl Web APIへの接続

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

var c = new HttpClient();
var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result;
if (r.IsSuccessStatusCode)
{
    Log.AddMessage(r.Content.Get<string>());
}
else
{
    Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase));
}

は、こんなこともやってみました。

var handler = new WebRequestHandler();
handler.ServerCertificateValidationCallback = delegate { return true; };
var c = new HttpClient(handler);
...

そして、この

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

が、毎回例外が発生します。

InnerException: System.Net.Http.HttpRequestException
   _HResult=-2146233088
   _message=An error occurred while sending the request.
   HResult=-2146233088
   IsTransient=false
   Message=An error occurred while sending the request.
   InnerException: System.Net.WebException
        _HResult=-2146233079
        _message=The request was aborted: Could not create SSL/TLS secure channel.
        HResult=-2146233079
        IsTransient=false
        Message=The request was aborted: Could not create SSL/TLS secure channel.
        Source=System
        StackTrace:
             at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
             at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
        InnerException: 

何が間違っているのでしょうか?なぜ私はこのサーバ(無効な自己署名証明書を持っている)に接続することができません。

どうしたらいいですか?

ServerCertificateValidationCallbackで正しく実行されています。これはあなたが直面している問題ではありません。あなたが直面している問題は、SSL/TLS プロトコルのバージョンである可能性が高いです。

たとえば、サーバーがSSLv3とTLSv10のみを提供し、クライアントがTLSv12を必要とする場合、このエラーメッセージが表示されます。必要なことは、クライアントとサーバーの両方でサポートされている共通のプロトコル バージョンがあることを確認することです。

できるだけ多くのサーバーに接続できるクライアントが必要なとき (できるだけ安全であることよりも)、私はこれを使用します (検証コールバックの設定と一緒に)。

  ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;