ServerCertificateValidationCallbackを設定しているにもかかわらず、SSL / TLSのセキュリティで保護されたチャネルを作成できませんでした


83

自己署名証明書を使用しテストサーバーへのSSL / TLS接続を確立しようとしています。安全でないチャネルを介した通信は問題なく機能しました。

このソリューションに基づいて作成したサンプルコードは次のとおり です。HttpClientC で信頼できないSSL証明書を許可する証明書エラーを無視しますか?ssl WebAPIに接続する.NETクライアント

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: 

私は何を間違えますか?このサーバー(無効な自己署名証明書がある)に接続できない理由

回答:


161

ServerCertificateValidationCallbackを使用して正しく実行しています。これはあなたが直面している問題ではありません。あなたが直面している問題は、おそらくSSL / TLSプロトコルのバージョンです。

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

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

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

1
同様の問題があります。POODLE攻撃のため、サーバー上のTLS1.0をシャットダウンする必要があります。これを行うと、サードパーティのアプリが機能しなくなります。assamblyを逆コンパイルすると、あなたと同様のコードが表示されます。GetAsyncの代わりにwebclientc.SendAsyncを使用します。テストのためにコードをconsoleappにコピーすると、エラーを再現できます。ServicePointManager.SecurityProtocol= SecurityProtocolType.Tls11を追加することで、機能します。使用するTLSバージョンを明らかにするために、サーバーとクライアントの間に何らかのハンドシェイクがあると思いましたか?1.0が無効になっていると、なぜ自動的に1.1が選択されないのですか?
エンゲルン2016

3
ありがとう!これで3時間苦労していました。この行を追加すると、私のためにそれをやった:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
トーマスT

1
新しいバージョンの.NETではデフォルトでこれが有効になっていることに注意してください。必要なのは、.NETバージョンを4.6.1に設定することだけです
martinh_kentico 2017年

1
それは、有効かどうかにかかわらず、あなたが気にしないことを正確に意味します。そのコールバックにより、その証明書のセキュリティチェックを簡単に回避できます。
Wapac 2017

1
すばらしい答えServicePointManager.SecurityProtocolです。おそらくこの値がデフォルトになるはずです。または、少なくとも、スローされた例外の内部に直接、より多くの洞察があるはずです。
チャド

28

私たちは今日同じ問題を解決してきました、そしてあなたがする必要があるのは.NETのランタイムバージョンを増やすことだけです

4.5.2は上記の問題では機能しませんでしたが4.6.1は問題ありませんでした

.NETバージョンを保持する必要がある場合は、

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

1
どのバリアントを使用し、どの程度正確に使用しましたか?
martinh_kentico 2017年

1
今日から特定のSSLサイトで動作しない.NET4.5アプリケーションがあります。4.6.1に変更すると正常に動作しますが、実際には変更できません。何をすべきかわかりません:|
Tsury 2017

16

まだこれに遭遇している人へのフォローアップと同じように、ソリューションに記載されているようにServicePointManager.SecurityProfileオプションを追加しました。

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

それでも、同じ「要求が中止されました:SSL / TLSのセキュリティで保護されたチャネルを作成できませんでした」というエラーが引き続き表示されます。HTTPS SOAP APIインターフェイス(ボイスメール、IP電話システムなど…数年前にインストールされたもの)を使用して、いくつかの古い音声サーバーに接続しようとしていました。これらは、数年前に最後に更新されたSSL3接続のみをサポートします。

SecurityProtocolsのリストにSSl3を含めると、ここでうまくいくと思うかもしれませんが、そうではありませんでした。接続を強制できる唯一の方法は、Ssl3プロトコルのみを含め、他のプロトコルは含めないことでした。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

その後、接続が確立されます–私にはバグのようですが、これは、何年も前から存在しているこれらのサーバーに提供するツールで最近までエラーをスローし始めませんでした–マイクロソフトはこれを更新するシステム変更の展開を開始したと思います他に選択肢がない場合を除き、TLS接続を強制する動作。

とにかく–いくつかの古いサイト/サーバーに対してまだこれに遭遇している場合は、試してみる価値があります。


1
PowerShellを介してCiscoUnified Communications AXL APIを使用するためのCUCMPowerShellモジュールがあります。あなたの回答は、を追加することでこれを修正するのに役立ちました[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Ssl3。ありがとうございました!完全なコードは、Invoke-CUCMSOAPAPIFunction
Chris Magnuson

2
@ Jeff-リンクされた記事をチェックしてください。Ssl3が機能しなかった理由を説明し、Ssl3を再度有効にする2つの方法を提案していると思います。docs.microsoft.com/en-us/dotnet/framework/migration-guide/…–
スコット

4

次の行を移動します:ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

この行の前:HttpWebRequest request =(HttpWebRequest)WebRequest.Create(uri);

元の投稿:KB4344167セキュリティアップデートがTLSコードを壊す


1
上記のすべてを無駄に試した後、これが答えでした。HttpWebRequestを作成する前にServicePointManagerを設定する必要があります。
ヘンリー・錆びた

1

私の場合、TLS1_2はクライアントとサーバーの両方で有効になっていますが、サーバーはMD5を使用しており、クライアントはそれを無効にしています。したがって、http: //ssllabs.comでクライアントとサーバーの両方をテストするか、openssl / s_clientを使用してテストし、何が起こっているかを確認します。また、Wiresharkを使用して選択した暗号を確認してください。


1

TLS1.0および1.1はサポート終了になりました。アマゾンウェブサーバーのパッケージが更新され、このエラーが発生し始めました。

答えは上にありますが、tlsまたはを使用するべきではありtls11ません。

特にASP.Netの場合は、これをスタートアップメソッドの1つに追加します。

        public Startup()
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12;

しかし、私はこのようなものが他の多くの場合に機能すると確信しています。


0

新しいドメイン名を使用していて、上記のすべてを実行しても同じエラーが発生する場合は、PCのDNSキャッシュをクリアするかどうかを確認してください。 詳細については、DNSクリアしてください。

Windows®8

Windows 8を使用している場合にDNSキャッシュをクリアするには、次の手順を実行します。

キーボードで、Win + Xを押してWinXメニューを開きます。

[コマンドプロンプト]を右クリックし、[管理者として実行]を選択します。

次のコマンドを実行します。

ipconfig / flushdns

コマンドが成功すると、システムは次のメッセージを返します。

Windows IP構成は、DNSリゾルバーキャッシュを正常にフラッシュしました。

Windows®7

Windows 7を使用している場合にDNSキャッシュをクリアするには、次の手順を実行します。

[開始]をクリックします。

[スタート]メニューの検索テキストボックスにcmdと入力します。

[コマンドプロンプト]を右クリックし、[管理者として実行]を選択します。

次のコマンドを実行します。

ipconfig / flushdns

コマンドが成功すると、システムは次のメッセージを返します。WindowsIP構成がDNSリゾルバーキャッシュを正常にフラッシュしました。


ipconfig /flushdnsC#で?
キケネット2018年

0

このスレッドに出くわしたのは、「SSL / TLSのセキュリティで保護されたチャネルを作成できませんでした」というエラーもあったためです。 私の場合、を使用してPowerShellからSiebel構成REST APIにアクセスしようとしましたInvoke-RestMethodが、上記の提案はどれも役に立ちませんでした。

最終的に、問題の原因に遭遇しました。接続していたサーバーに必要なクライアント証明書認証がありました。

呼び出しを機能させるには、クライアント証明書(秘密鍵を含む)に次の-Certificateパラメーターを指定する必要がありました。

$Pwd = 'certificatepassword'
$Pfx = New-Object -TypeName 'System.Security.Cryptography.X509Certificates.X509Certificate2'
$Pfx.Import('clientcert.p12', $Pwd, 'Exportable,PersistKeySet')
Invoke-RestMethod -Uri 'https://your.rest.host/api/' -Certificate $Pfx -OtherParam ...

うまくいけば、私の経験がこの問題の私の特定の味を持っている他の誰かを助けるかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.