リクエストは中止されました:SSL/TLSセキュアチャネルを作成できませんでした

StackOverflow https://stackoverflow.com/questions/2859790

質問

使用するHTTPSサーバーに接続することはできません WebRequest このエラーメッセージのため:

The request was aborted: Could not create SSL/TLS secure channel.

サーバーには使用されたパスを備えた有効なHTTPS証明書がないことがわかっていますが、この問題をバイパスするために、別のStackOverFlow投稿から取った次のコードを使用します。

private void Somewhere() {
    ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AlwaysGoodCertificate);
}

private static bool AlwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) {
   return true;
}

問題は、サーバーが証明書を検証せず、上記のエラーで失敗することです。誰かが私が何をすべきかについて何か考えを持っていますか?


同僚と私は数週間前にテストを実行し、上記のようなものでうまく機能していたことに言及する必要があります。私たちが見つけた唯一の「大きな違い」は、私がWindows 7を使用しており、彼がWindows XPを使用していたことです。それは何かを変えますか?

役に立ちましたか?

解決

私はついに答えを見つけました(私は自分の情報源に気づいていませんが、それは検索からでした)。

コードはWindows XPで動作しますが、Windows 7では、最初にこれを追加する必要があります。

// using System.Net;
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// Use SecurityProtocolType.Ssl3 if needed for compatibility reasons

そして今、それは完全に機能します。


補遺

ロビン・フレンチが述べたように。 PayPalの構成中にこの問題が発生している場合は、2018年12月3日までにSSL3をサポートしないことに注意してください。TLSを使用する必要があります。これがそうです PayPalページ それについて。

他のヒント

これに対する解決策、.NET 4.5 IS

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

.NET 4.5を持っていない場合は、使用してください

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

httpwebrequestが作成される前に、ServicePointManagerの設定が作成されていることを確認してください。

作品:

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

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")

失敗:

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")

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

あなたが抱えている問題は、ASPNETユーザーが証明書にアクセスできないということです。 winhttpcertcfg.exeを使用してアクセスする必要があります

これを設定する方法の例は、次のとおりです。http://support.microsoft.com/kb/901183

詳細については、ステップ2の下で

編集:IISの最近のバージョンでは、この機能は証明書マネージャーツールに組み込まれており、証明書を右クリックし、プライベートキーを管理するオプションを使用することでアクセスできます。詳細はこちら: https://serverfault.com/questions/131046/how-to-grant-iis-7-5-access-to-a-certificate-in-certificate-store/132791#132791

エラーは一般的であり、SSL/TLSの交渉が失敗する理由はたくさんあります。最も一般的なのは無効または期限切れのサーバー証明書であり、独自のサーバー証明書の検証フックを提供することでそれを処理しましたが、必ずしも唯一の理由ではありません。サーバーは相互認証を必要とする場合があり、クライアントによってサポートされていない暗号のスイートで構成されている場合があります。握手が成功するには時間が大きすぎると、さらに多くの理由があります。

最良の解決策は、シャネルトラブルシューティングツールセットを使用することです。 SchannelはSSLとTLSを担当するSSPIプロバイダーであり、クライアントは握手に使用します。を見てみましょう TLS/SSLツールと設定.

また、参照してください シャネルイベントロギングを有効にする方法.

私はこの問題を抱えてヒットしようとしました https://ct.mob0.com/styles/fun.png, 、Spdyや奇妙なRedirect SSL CERTSなどのクレイジーなものをサポートするCDNでCloudFlareによって分散された画像です。

Simonsの回答のようにSSL3を指定する代わりに、このようにTLS12に下ることで修正することができました。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
new WebClient().DownloadData("https://ct.mob0.com/Styles/Fun.png");

この同じ問題で何度も長い時間を過ごした後、クライアントサービスが実行されていたASP.NETアカウントが証明書にアクセスできないことがわかりました。 Webアプリが実行されるIISアプリケーションプールに移動し、高度な設定に移動し、IDを変更することで修正しました。 LocalSystem からのアカウント NetworkService.

より良い解決策は、デフォルトで証明書を動作させることです NetworkService アカウントですが、これは迅速な機能テストで機能します。

元の答えにはありませんでした。弾丸の証拠にするために、さらにコードを追加しました。

ServicePointManager.Expect100Continue = true;
        ServicePointManager.DefaultConnectionLimit = 9999;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;

別の可能性は、ボックス上の不適切な証明書のインポートです。必ず囲まれたチェックボックスを選択してください。最初は私はそれをしなかったので、コードはタイミングアウトするか、秘密鍵を見つけることができなかったのと同じ例外をスローしていました。

certificate importation dialog

「リクエストは中止されました:SSL/TLSセキュアチャネルを作成できませんでした」例外はサーバーが戻っている場合に発生する可能性があります HTTP 401不正 HTTP要求への応答。

で説明されているように、クライアントアプリケーションのトレースレベルSystem.NETロギングをオンにすることで、これが起こっているかどうかを判断できます この答え.

そのロギング構成が整ったら、アプリケーションを実行してエラーを再現し、次にこのような行のログ出力を調べます。

System.Net Information: 0 : [9840] Connection#62912200 - Received status line: Version=1.1, StatusCode=401, StatusDescription=Unauthorized.

私の状況では、サーバーが期待している特定のCookieを設定できず、401エラーでサーバーがリクエストに応答し、「SSL/TLSセキュアチャネルを作成できませんでした」例外につながりました。

私の場合のこの例外のルートは、コードのある時点で、次のように呼ばれていたことでした。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

これは本当に悪いです。 .NETに不安定なプロトコルを使用するように指示するだけでなく、これはAppDomain内で行われたすべての新しいWebClient(および同様の)リクエストに影響を与えます。 (着信WebリクエストはASP.NETアプリでは影響を受けませんが、外部Webサービスと通信するなどの新しいWebClientリクエストはそうです)。

私の場合、それは実際には必要ありませんでしたので、ステートメントを削除するだけで、他のすべてのWebリクエストが再び正常に動作し始めました。他の場所での私の読書に基づいて、私はいくつかのことを学びました:

  • これはAppDomainのグローバルな設定であり、同時アクティビティがある場合、それを1つの値に確実に設定し、アクションを実行してから戻すことはできません。その小さな窓の間に別のアクションが行われ、影響を受けることがあります。
  • 正しい設定は、デフォルトのままにすることです。これにより、.NETは、時間が経つにつれて最も安全なデフォルト値であるものを使用し続けることができ、フレームワークをアップグレードできます。 TLS12(この執筆時点で最も安全です)に設定します しかし、5年後には神秘的な問題を引き起こす可能性があります。
  • 本当に値を設定する必要がある場合は、別の専門アプリケーションまたはAppDomainでそれを行うことを検討し、それとメインプールの間で話す方法を見つける必要があります。それは単一のグローバル価値であるため、ビジーアプリプール内でそれを管理しようとすると、トラブルにつながるだけです。この答え: https://stackoverflow.com/a/26754917/7656 カスタムプロキシによって可能なソリューションを提供します。 (個人的に実装していないことに注意してください。)

これはMVC WebClientで私のために働いています

    public string DownloadSite(string RefinedLink)
    {
        try
        {
            Uri address = new Uri(RefinedLink);

            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

            using (WebClient webClient = new WebClient())
            {
                var stream = webClient.OpenRead(address);
                using (StreamReader sr = new StreamReader(stream))
                {
                    var page = sr.ReadToEnd();

                    return page;
                }
            }

        }
        catch (Exception e)
        {
            log.Error("DownloadSite - error Lin = " + RefinedLink, e);
            return null;
        }
    }

あなたが言うことができるように、これが起こるかもしれない多くの理由があります。出会った原因を追加すると思った...

の値を設定した場合 WebRequest.Timeout0, 、これはスローされる例外です。以下は私が持っていたコードです...(ハードコードの代わりに 0 タイムアウト値のために、誤って設定されたパラメーターがありました 0).

WebRequest webRequest = WebRequest.Create(@"https://myservice/path");
webRequest.ContentType = "text/html";
webRequest.Method = "POST";
string body = "...";
byte[] bytes = Encoding.ASCII.GetBytes(body);
webRequest.ContentLength = bytes.Length;
var os = webRequest.GetRequestStream();
os.Write(bytes, 0, bytes.Length);
os.Close();
webRequest.Timeout = 0; //setting the timeout to 0 causes the request to fail
WebResponse webResponse = webRequest.GetResponse(); //Exception thrown here ...

の別の考えられる原因 The request was aborted: Could not create SSL/TLS secure channel エラーはaです クライアントPCの構成されたCIPHER_SUITES値と、サーバーが意欲的で受け入れることができるように構成されている値との間の不一致. 。この場合、クライアントが最初のSSLハンドシェイク/ネゴシエーション「クライアントハロー」メッセージで受け入れることができるCIPHER_SUITES値のリストを送信すると、サーバーは提供された値が許容されないことを確認し、「アラートを返すことができます「SSLハンドシェイクの「サーバーハロー」ステップに進む代わりに、応答。

この可能性を調査するために、ダウンロードできます Microsoftメッセージアナライザー, 、そしてそれを使用して、サーバーへのHTTPS接続を確立しようとしないときに発生するSSLネゴシエーションのトレースを実行します(C#アプリ)。

別の環境からHTTPS接続を成功させることができる場合(たとえば、あなたが言及したWindows XPマシンなど、またはOSのCipherスイート設定を使用しない非マイクロソフトブラウザーでHTTPS URLを押すことによって、 ChromeまたはFirefox)、その環境で別のメッセージアナライザートレースを実行して、SSLの交渉が成功したときに何が起こるかをキャプチャします。

うまくいけば、2つのクライアントのハローメッセージに何らかの違いが表示されます。これにより、失敗したSSL交渉が失敗していることについて正確に特定できるようになります。次に、Windowsを成功させるために、Windowsに構成変更を変更できるはずです。 iiscrypto これに使用するのに最適なツールです(「IIS」名にもかかわらず、クライアントPCであっても)。

次の2つのWindowsレジストリキーは、PCが使用するCIPHER_SUITES値を管理します。

  • hklm software policies microsoft cryptography configuration ssl 00010002
  • hklm system currentControlset control cryptography configuration local ssl 00010002

これは、私がこの多様性のインスタンスを調査し解決した方法の完全な記事です Could not create SSL/TLS secure channel 問題: http://blog.jonschneider.com/2016/08/fix-ssl handshaking-error-in-windows.html

私は一日中この問題に苦労してきました。

.NET 4.5を使用して新しいプロジェクトを作成したとき、ついに機能しました。

しかし、4.0に格下げした場合、同じ問題が再び届きましたが、そのプロジェクトに対しては不可逆的でした(4.5に再びアップグレードしようとした場合でも)。

奇妙な他のエラーメッセージはありません 「リクエストは中止されました。SSL/TLSセキュアチャネルを作成できませんでした。」 このエラーのために現れました

クライアントがWindowsマシンである場合、サービスが必要とするTLSまたはSSLプロトコルがアクティブになっていない可能性がある場合があります。

これを設定できます。

コントロールパネル - >ネットワークとインターネット - >インターネットオプション - > Advanced

設定を「セキュリティ」までスクロールして選択します

  • SSL 2.0を使用します
  • SSL 3.0を使用します
  • TLS 1.0を使用します
  • TLS 1.1を使用します
  • TLS 1.2を使用します

enter image description here

私のweb.configが持っていたので、私はこの問題を抱えていました:

<httpRuntime targetFramework="4.5.2" />

そしてそうではありません:

<httpRuntime targetFramework="4.6.1" />

私の場合、アプリケーションを実行しているサービスアカウントには、秘密鍵にアクセスする許可がありませんでした。この許可を与えたら、エラーが消えました

  1. MMC
  2. 証明書
  3. 個人に拡張します
  4. SELECT CERT
  5. 右クリック
  6. すべてのタスク
  7. プライベートキーを管理します
  8. 追加

Visual Studioからコードを実行している場合は、管理者としてVisual Studioを実行してみてください。私のために問題を修正しました。

私は同じ問題を抱えていて、見つけました この答え 私のために適切に働いた。キーは3072です。 このリンク 「3072」の修正の詳細を提供します。

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

XmlReader r = XmlReader.Create(url);
SyndicationFeed albums = SyndicationFeed.Load(r);

私の場合、2つのフィードには修正が必要でした。

https://www.fbi.gov/feeds/fbi-in-the-news/atom.xml
https://www.wired.com/feed/category/gear/latest/rss

System.net.Webexception:リクエストは中止されました:SSL/TLSセキュアチャネルを作成できませんでした。

私たちの場合、ソフトウェアベンダーを使用して.NETコードを変更するためにアクセスできなかった場合。どうやら.NET 4は、変更がない限り、TLS V 1.2を使用しません。

私たちの修正は、レジストリにSchusestrongCryptoキーを追加することでした。以下のコードを.REG拡張子を使用してテキストファイルにコピー/貼り付けて実行できます。それは問題に対する「パッチ」として機能しました。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

これを試して:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

最高の回答 おそらくほとんどの人にとって十分でしょう。ただし、状況によっては、TLS 1.2を強制した後でも、「SSL/TLSセキュアチャネルを作成できなかった」エラーを取得し続けることができます。もしそうなら、あなたは相談したいかもしれません この役立つ記事 追加のトラブルシューティング手順。要約すると、TLS/SSLバージョンの問題とは無関係に、クライアントとサーバーは「Cipher Suite」に同意する必要があります。 SSL接続の「ハンドシェイク」フェーズ中、クライアントは、サーバーが独自のリストに対してチェックするためにサポートされている暗号スイートをリストします。しかし、一部のWindowsマシンでは、特定の一般的な暗号スイーツが無効になっている可能性があり(攻撃面を制限する意図的な試みによるように思われます)、クライアントとサーバーが暗号スイートに同意する可能性を減らします。同意できない場合は、イベントビューアーに「致命的なアラートコード40」が表示され、.NETプログラムに「SSL/TLSセキュアチャネルを作成できませんでした」が表示されます。

前述の記事では、マシンの潜在的にサポートされている暗号スイートをすべてリストし、Windowsレジストリを介して追加の暗号スイートを有効にする方法について説明します。クライアントでどの暗号スイートが有効になっているかを確認するには、訪問してみてください この診断ページ MSIEで。 (System.NETトレースを使用すると、より決定的な結果が得られる場合があります。)サーバーによってどの暗号スイートがサポートされているかを確認するには、試してください このオンラインツール (サーバーがインターネットアクセス可能であると仮定)。それは言うまでもありません レジストリの編集は注意して行う必要があります, 、特にネットワーキングが関与している場合。 (あなたのマシンはリモートホストされたVMですか?ネットワーキングを壊す場合、VMはまったくアクセスできますか?)

私の会社の場合、レジストリ編集を介していくつかの追加の「ECDHE_ECDSA」スイートを可能にし、即時の問題を修正し、将来の問題を防ぎました。しかし、レジストリを編集できない(またはしない)場合は、多数の回避策(必ずしもきれいではない)が思い浮かびます。たとえば、.NETプログラムは、SSLトラフィックを別のPythonプログラムに委任することができます(Chromeリクエストが影響を受けるマシンでリクエストが失敗した場合に成功する可能性があるため、それ自体が機能する可能性があります)。

私にとっての問題は、私がWebサービスとしてIISに展開しようとしていたことです。サーバーに証明書をインストールしましたが、IISを実行するユーザーは証明書に正しい許可を持っていませんでした。

証明書ストアの証明書の秘密鍵にASP.NETをアクセスするにはどうすればよいですか?

私の場合、WindowsサービスがWebサービスに接続しようとしたときにこの問題が発生しました。 Windowsイベントを見ると、ついにエラーコードが見つかりました。

イベントID 36888(シャネル)が提起されます:

The following fatal alert was generated: 40. The internal error state is 808.

最後に、Windows Hotfixに関連していました。私の場合:KB3172605およびKB3177186

VMwareフォーラムで提案されたソリューションは、Windowsにレジストリエントリを追加することでした。次のレジストリを追加した後、すべて正常に動作します。

hkey_local_machine system currentControlset control securityproviders schannel keyexchangealgorithms diffie-hellman

「clientminkeybitlength "= dword:00000200

どうやら、それはクライアント側のHTTPSハンドシェイクの欠損値と関連しているようです。

Windows Hotfixをリストします:

wmic qfe list

ソリューションスレッド:

https://communities.vmware.com/message/2604912#2604912

それが役立つことを願っています。

答えは私のためにうまくいきませんでした。

これがうまくいったものです:

初期化する代わりに X509Certifiacte2 このような:

   var certificate = new X509Certificate2(bytes, pass);

私はこのようにやった:

   var certificate = new X509Certificate2(bytes, pass, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

に注意してください X509KeyStorageFlags.Exportable !!

私は残りのコードを変更しませんでした( WebRequest 自体):

// I'm not even sure the first two lines are necessary:
ServicePointManager.Expect100Continue = true; 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

request = (HttpWebRequest)WebRequest.Create(string.Format("https://{0}.sii.cl/cvc_cgi/dte/of_solicita_folios", server));
request.Method = "GET";
request.Referer = string.Format("https://hercules.sii.cl/cgi_AUT2000/autInicio.cgi?referencia=https://{0}.sii.cl/cvc_cgi/dte/of_solicita_folios", servidor);
request.UserAgent = "Mozilla/4.0";
request.ClientCertificates.Add(certificate);
request.CookieContainer = new CookieContainer();

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    // etc...
}

実際、最初の2行が必要かどうかさえわかりません...

この質問は、一般的なエラーメッセージに関するものであるため、多くの答えがあります。いくつかのサーバーでこの問題に遭遇しましたが、開発マシンではありませんでした。髪の毛のほとんどを引き出した後、マイクロソフトのバグであることがわかりました。

https://support.microsoft.com/en-us/help/4458166/applications-that-that--one-tls-2-2-strong-encryption-experience-connect

基本的に、MSは暗号化が弱いと想定していますが、OSはTLS 1.2のみを許可するようにパッチされているため、恐ろしい「リクエストは中止されました。SSL/TLSセキュアチャネルを作成できませんでした」

3つの修正があります。

1)適切な更新でOSにパッチを当てます。 http://www.catalog.update.microsoft.com/search.aspx?q=kb4458166

2)app.config/web.configファイルに設定を追加します。

3)別の回答で既に言及されているレジストリ設定を追加します。

これらはすべて、私が投稿したナレッジベースの記事に記載されています。

問題が証明書の有効性に関連しているかどうかを確認するために、デモ証明書(一部のSSLプロバイダーは1か月間無料で提供されます)をインストールすることができます。

これが比較的「ライブ」リンクである限り、新しいオプションを追加すると思いました。その可能性は、プードル攻撃の問題のために、サービスがSSL 3.0をサポートしていないことです。これに関するGoogleステートメントをご覧ください。私は一度にいくつかのWebサービスでこの問題に遭遇し、何かが起こっている必要があることに気付きました。 TLS 1.2に切り替えましたが、すべてが再び機能しています。

http://googleonlinesecurity.blogspot.com/2014/10/this-poodle-bites-exploiting-ssl-30.html

これは、たった1つのサイトで私のために起こっていましたが、RC4暗号しか利用できなかったことがわかりました。サーバーを強化するための以前の努力の中で、RC4暗号を無効にしましたが、これを再確認できたら、この問題は解決しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top