web-dev-qa-db-ja.com

セキュアチャネルのサポートでエラーが発生しました-クラシックASP HTTP要求

私は古典的なASP Windows Server 2012ボックスで実行されているWebサイトを持っています。

Sub ShopXML4http(url, inStr, outStr, method, xmlerror)
  Dim objhttp
  Set objhttp = Server.CreateObject ("MSXML2.ServerXMLHTTP.6.0")
  objHttp.open method, url, false
  If Method="POST" Then
    objHttp.Send instr
  Else
    objHttp.Send
  End if   
  outstr=objHttp.responseText
  Set objhttp=nothing
End Sub

このコードはほとんどの場合(1日に数千のリクエスト)正常に動作しますが、散発的に次のようなメッセージで失敗します。

番号:-2147012739

説明:セキュアチャネルサポートでエラーが発生しました

ソース:msxml6.dll

アプリケーションは最近、古いWindows 2003 Serverから2012 Serverに移動されましたが、この問題が古いサーバーで問題になることはありませんでした。さらに、このエラーがWebサイトで発生している間、VBScriptでまったく同じコードを実行でき、正常に動作します。アプリケーションプールをリセットすると、サイトが安全なHTTPリクエストを再度実行できるようになります(ただし、サーバーに到達する前にサイト自体が修正されることがよくあります)。

30
Mike S

2003年から2008 R2に移行した後、まったく同じ問題が発生し、解決策が見つかりました。変化する:

Set objhttp = Server.CreateObject ("MSXML2.ServerXMLHTTP.6.0")

に:

Set objhttp = Server.CreateObject ("MSXML2.XMLHTTP.6.0")

あなたの問題はなくなります。

両方のオブジェクトの長所と短所を見つけようとしましたが、XMLHTTPを使用しない理由はまだ見つかりませんでした。

17
user3087157

私は同じ問題を抱えて、さまざまな投稿の下で提供される多くのソリューションを試しましたが、今までは最終的に成功しませんでした。私の場合はPaypalだったので、この問題を参照して、私にとってうまくいった解決策を詳しく説明します。これは将来の単なるPaypalの問題ではない可能性があるため、新しい投稿は開いていません。

このソリューションは、同様の問題に対する多くのstackoverflow投稿ソリューションの組み合わせですが、これは追加するのに最適なものと思われました。

問題

クラシックASP= Paypal Sandboxを使用してWindows Server 2008でPaypal IPNをテストしようとすると、エラー「セキュリティで保護されたチャネルのサポートでエラーが発生しました」が返されます。

なぜそれが問題なのか

Paypalは、システムとのすべての通信が可能な限り安全であることを要求しています。 TLS 1.2の接続が必要になります。 Windows Server 2008は、デフォルトではTLS 1.2ではありません。

Paypalは、Verisign G5証明書が必要だと言って混乱を招きました。これは、サーバーのルートに対して行いますが、コードを実行しているドメインに対しては行いません。 APIを使用しないため、Paypal証明書もインストールしませんでした。 HTTPSサイトからの通信も必要ないと思います-私のドメインは標準のGoDaddy EV証明書を使用して保護されていますが、その後HTTPS以外のサイトでテストを行いましたが、それでも機能しました。

私の解決策

  1. まず、サーバーが使用しているセキュリティの種類を SSL Labs で確認します。 TLS1.2以上で、他のTLSやSSLは使用できません。 SHA256暗号化も必要です。サーバーにパッチを適用する必要がある場合があります: https://support.Microsoft.com/en-us/kb/3106991

  2. IISCryptoを使用して、正しいTLSと暗号を設定します。 stackoverflowの他の場所で提供されているレジストリの変更を使用しましたが、これは機能せず、実際、開発サイトだけでなくHTTPS投稿を使用してすべてのサーバーを完全に台無しにしました! IISCryptoは暗号も処理します。

  3. アプリケーションプールがv4.5であることを確認してください。IISはv4.0のみを提供する可能性があるため、それ自体は不明ですただし、これはおそらく実際にはv4.5です。これは https://msdn.Microsoft.com/en-us/library/hh925568(v = vs.110).aspx で確認できます。 =。

  4. コード内では、上記のServer.CreateObject ("MSXML2.XMLHTTP.6.0")ではなく、Server.CreateObject ("MSXML2.ServerXMLHTTP.6.0")を使用する必要があります。

今では、サーバー以外のXMLHTTPが機能する理由がわかりませんが、その背後にあるドキュメントに反しているようです。今、10日間のストレス、パニック、フラストレーションの後、私は気にしません!これが他の人に役立つことを願っています。

解決策を見つけるのは悪夢だったので、検索するときに他の人を助けるために以下のフレーズを追加します:

サーバーエラーでPaypal IPNが失敗する

Paypal SSL Windows 2008エラー

セキュアチャネルサポートでエラーが発生しました

classic ASP Paypal Sandbox SSL errors

RackspaceとGoDaddyの支援に感謝します。 Paypalがこれまでで最悪の技術サポートを提供していることに気づき、彼らが応答した場合、常に自分のドキュメントを指して気にしないことを公表したいと思います。彼らは、2014年9月からこの件に関するメールを送信していると言っていますが、私はそれを受け取りませんでした。これらの新しい要件はPaypal Sandboxで有効ですが、2016年9月に公開されます。サンドボックスが必要な新しいソリューションの開発として出会っただけです。ライブで実行している場合、あなたは水で死んでいます。 Paypalサンドボックスでお支払いシステム全体をテストしてください。

7
Steve Neale

上記の答えは私の状況には当てはまりません。それから私はここのリンクに飛び乗った:

https://support.Microsoft.com/en-za/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-a-default-secure- protocols-in

この更新プログラムは、Windows Server 2012、Windows 7 Service Pack 1(SP1)、およびWindows Server 2008 R2 SP1のトランスポート層セキュリティ(TLS)1.1およびTLS 1.2のサポートを提供します。

WINHTTP_OPTION_SECURE_PROTOCOLSフラグを使用するSecure Sockets Layer(SSL)接続にWinHTTPを使用して作成されたアプリケーションとサービスは、TLS 1.1またはTLS 1.2プロトコルを使用できません。これは、このフラグの定義にこれらのアプリケーションとサービスが含まれていないためです。

この更新プログラムは、システム管理者がWINHTTP_OPTION_SECURE_PROTOCOLSフラグを使用するときに使用するSSLプロトコルを指定できるようにするDefaultSecureProtocolsレジストリエントリのサポートを追加します。

これにより、WinHTTPのデフォルトフラグを使用するように構築された特定のアプリケーションが、アプリケーションを更新する必要なく、新しいTLS 1.2またはTLS 1.1プロトコルをネイティブに活用できるようになります。

これは、SharePointライブラリまたはWebフォルダーからドキュメントを開くMicrosoft Officeアプリケーション、DirectAccess接続用のIP-HTTPSトンネル、およびWebDavを使用したWebClientなどの技術を使用するその他のアプリケーションの場合です。 WinRMなど。

このアップデートは、デフォルトのフラグを渡す代わりに、安全なプロトコルを手動で設定しているアプリケーションの動作を変更しません。

Client service on Windows 2008 R2サーバーTLS経由でサーバーに送信すると、問題のエラーが返されました。暗号スイートの互換性だと思いました。 Wiresharkトレースは、Client HelloリクエストのバージョンがTLS 1.0であったが、サーバーにはTLS 1.2が必要であることを示しました。クライアントサービスから送信サーバーに送信される暗号スイートは問題ありませんでした。問題は、Windowsサーバーのデフォルトのクライアントサービスまたはアプリケーションが、TLS 1.2ではないシステムデフォルトを採用していることです。

解決策は、DefaultSecureProtocolsという名前のレジストリサブキーを、サポートするTLSバージョンに対応する値と共に追加することです。タイプDWORDの上記のレジストリサブキーを次の場所に追加します。

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp
  • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp

Internet Explorerの修正では、SecureProtocolsというタイトルの同様のレジストリサブキーを、同じくDWORDタイプで、次の場所に追加できます。

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings

以下に、両方のサブキーの値の表を示します。

DefaultSecureProtocols Value         Protocol enabled
0x00000008                           Enable SSL 2.0 by default
0x00000020                           Enable SSL 3.0 by default
0x00000080                           Enable TLS 1.0 by default
0x00000200                           Enable TLS 1.1 by default
0x00000800                           Enable TLS 1.2 by default

例:

管理者は、WINHTTP_OPTION_SECURE_PROTOCOLSのデフォルト値をオーバーライドして、TLS 1.1およびTLS 1.2を指定することを望んでいます。

TLS 1.1(0x00000200)の値とTLS 1.2(0x00000800)の値を取得し、それらを電卓(プログラマーモード)で加算すると、結果のレジストリ値は0x00000A00になります。

私は両方のサブキーの値として0x00000A00を適用し、問題を解決しました。

また、Microsoftから入手可能なEasy Fix(リンクはこちら: https://aka.ms/easyfix51044 )、レジストリのサブキーと値を手動で入力したくない場合。

3
user3621633

エラーコードのトラブルシューティング:

  1. -2147012739はHRESULTです。
  2. 16進数では0x80072F7Dです。
  3. LOWORDを見てください:0x2F7D。
  4. それを10進数に戻す:12157。
  5. 12157エラーコードを検索します。
  6. 一致することを確認します:ERROR_WINHTTP_SECURE_CHANNEL_ERROR

Google-fuの一部は http://msdn.Microsoft.com/en-us/library/windows/desktop/aa383770(v = vs.85).aspx を見つけます。

ERROR_WINHTTP_SECURE_CHANNEL_ERROR

12157

セキュアチャネルに関連するエラーが発生したことを示します(「winerror.h」ヘッダーファイルにリストされている「SEC_E_」および「SEC_I_」で始まるエラーコードに相当)。

ただし、受け取ったメッセージは「説明:セキュアチャネルサポートでエラーが発生しました」であったため、すでにこれを発見しています。だから、これは私たちが始めた場所に私たちを導きます。

私が行う他の観察は、あなたのコードは非同期のWinHTTPリクエストであるということです(ASP内で機能する必要があることは知っています)が、懸念は、高頻度のため、マシンが複数のWinHTTPを処理する可能性があること同時に要求します。一部のWindowsが、遅延した要求をブロックすることにより、アクティブな同時WinHTTP要求の合計数を意図的に調整するのを見てきました。たとえば、Windows 7マシンでは、プロセスは同じリモートサーバーに対して3つ以上の同時要求を行うことはできません。つまり、3番目、4番目...のリクエストは、最初の2つが完了するまでブロックされます。

1つの解決策は、着信要求を複数のアプリケーションプールまたは複数のサーバーで負荷分散することです。

2
Stephen Quan

この問題にはさまざまなバリエーションがあり、それを理解するのに時間がかかりました。
状況は次のとおりです。PHPで記述されたアプリケーションをホストし、Webサービス呼び出しを通じてデータを提供する古いLinuxサーバー。サーバーはHTTPSを使用しています。さまざまなクライアントからの呼び出しはコードで行われますwinHTTP 5.2ライブラリーを使用する(Winhttp.dll)

症状:「POST」コマンドを使用して繰り返しwinHTTP呼び出しを行うと、クライアントに散発的なエラーメッセージが表示されるようになりました。メッセージは、「関数に供給されたバッファが小さかった」または「セキュアチャネルサポートでエラーが発生しました」のいずれかです。よく調べた結果、クライアントのサーバーが、表示されているエラーメッセージに対応する「SchannelイベントID 36887アラートコード20」をイベントビューアーに記録していることがわかりました。

解決策:古いLinuxサーバーがTLS 1.2をサポートできないことがわかりました。 (CentOS 5.11)また、いくつかのクライアントが最近(2016年夏)Microsoftサーバーに更新プログラムを適用したこともわかりました。 (サーバー2008、サーバー2012)修正は、サーバーがWebサービス呼び出しにTLS 1.1を使用するように強制することでした。私にとって奇妙な部分は、TLSを変更するためのInternet Explorerの設定が問題に影響しなかったことです。ただし、グループポリシーの設定を変更することで、問題を解決できました。この問題に関する当社の技術顧問は、この変更は本当にあいまいであるが、サードパーティベンダーが迅速なソリューションを提供していることを指摘しました。このツールは、IIS Nartacの暗号。 https://www.nartac.com/Products/IISCrypto/Download このツールでは、プロトコルを具体的に選択できます。アプリケーション(CentOS 6)をホストする新しいサーバーを取得し、TLS 1.2プロトコルを使用できるようになりました!

2
Tom Fahey

それはすべて有効ですが、IIS7.5とクラシックASPを使用したWindows 7でのTLS1.2サポートの「クリティカル」な欠落ビットは、レジストリでこれを設定しています:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp]
"DefaultSecureProtocols"=dword:00000800

無駄な時間を省き、再起動し、頭を悩ませる1日を節約できることを願っています! :)

このコードスニペットはテストに役立ちます。 https://www.howsmyssl.com/

<%
Set winhttp = Server.CreateObject("WinHTTP.WinHTTPRequest.5.1")
winhttp.open "GET", "https://howsmyssl.com/a/check", False
winhttp.Send
Response.Write winhttp.responseText 
%>
2
Gruff

Windows Server 2016 Classic ASPスクリプトでは、Windows Server 2012 R2からHTTPS URLを取得しました。最近、このセキュアチャネルエラー-2147012739を停止するためにSecureProtocolsからSSL 2.0を削除する必要がありました。

' Use the latest client
Set httpClient = Server.CreateObject("WinHttp.WinHttpRequest.5.1")

' allow only TLS 1.2 or TLS 1.1
Const WHR_SecureProtocols = 9
httpClient.Option(WHR_SecureProtocols) = &h0800 + &h0200 
' Other values: TLS 1.0 &h0080, SSL 3.0 &h0020, SSL 2.0 &h0008 
' NB Including SSL 2.0 stops https to Windows Server 2012 R2 working

' Other options you may want to set, from https://docs.Microsoft.com/en-us/windows/desktop/winhttp/winhttprequestoption 

' Ignore certificate errors
Const WHR_SslErrorIgnoreFlags = 4
httpClient.Option(WHR_SslErrorIgnoreFlags) = &h3300 

' Don't bother checking cert, or risking failure if we can't check
Const WHR_EnableCertificateRevocationCheck = 18
httpClient.Option(WHR_EnableCertificateRevocationCheck) = False 
1
stevek_mcc

私は数ヶ月前に自分でこのエラーに遭遇しました。ほとんどの場合、この問題は無効なSSL証明書が原因です。投稿の時点で新しいサーバーに移行したばかりであることを考慮すると、おそらくSSL証明書を再インストールする必要があるだけです。

私はこの質問が古いことを知っていますが、うまくいけば他の誰かが私の答えから利益を得ることができます。

0
coderpro