私は古典的な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リクエストを再度実行できるようになります(ただし、サーバーに到達する前にサイト自体が修正されることがよくあります)。
2003年から2008 R2に移行した後、まったく同じ問題が発生し、解決策が見つかりました。変化する:
Set objhttp = Server.CreateObject ("MSXML2.ServerXMLHTTP.6.0")
に:
Set objhttp = Server.CreateObject ("MSXML2.XMLHTTP.6.0")
あなたの問題はなくなります。
両方のオブジェクトの長所と短所を見つけようとしましたが、XMLHTTPを使用しない理由はまだ見つかりませんでした。
私は同じ問題を抱えて、さまざまな投稿の下で提供される多くのソリューションを試しましたが、今までは最終的に成功しませんでした。私の場合は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以外のサイトでテストを行いましたが、それでも機能しました。
まず、サーバーが使用しているセキュリティの種類を SSL Labs で確認します。 TLS1.2以上で、他のTLSやSSLは使用できません。 SHA256暗号化も必要です。サーバーにパッチを適用する必要がある場合があります: https://support.Microsoft.com/en-us/kb/3106991 。
IISCryptoを使用して、正しいTLSと暗号を設定します。 stackoverflowの他の場所で提供されているレジストリの変更を使用しましたが、これは機能せず、実際、開発サイトだけでなくHTTPS投稿を使用してすべてのサーバーを完全に台無しにしました! IISCryptoは暗号も処理します。
アプリケーションプールがv4.5であることを確認してください。IISはv4.0のみを提供する可能性があるため、それ自体は不明ですただし、これはおそらく実際にはv4.5です。これは https://msdn.Microsoft.com/en-us/library/hh925568(v = vs.110).aspx で確認できます。 =。
コード内では、上記の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サンドボックスでお支払いシステム全体をテストしてください。
上記の答えは私の状況には当てはまりません。それから私はここのリンクに飛び乗った:
この更新プログラムは、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
の上記のレジストリサブキーを次の場所に追加します。
Internet Explorerの修正では、SecureProtocols
というタイトルの同様のレジストリサブキーを、同じくDWORD
タイプで、次の場所に追加できます。
以下に、両方のサブキーの値の表を示します。
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 )、レジストリのサブキーと値を手動で入力したくない場合。
エラーコードのトラブルシューティング:
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つの解決策は、着信要求を複数のアプリケーションプールまたは複数のサーバーで負荷分散することです。
この問題にはさまざまなバリエーションがあり、それを理解するのに時間がかかりました。
状況は次のとおりです。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プロトコルを使用できるようになりました!
それはすべて有効ですが、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
%>
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
私は数ヶ月前に自分でこのエラーに遭遇しました。ほとんどの場合、この問題は無効なSSL証明書が原因です。投稿の時点で新しいサーバーに移行したばかりであることを考慮すると、おそらくSSL証明書を再インストールする必要があるだけです。
私はこの質問が古いことを知っていますが、うまくいけば他の誰かが私の答えから利益を得ることができます。