web-dev-qa-db-ja.com

ServerXMLHTTPオブジェクトでHTTPSを使用できません

HTTPS経由で支払いゲートウェイに接続するClassic ASPアプリケーションをサポートしています。最近まで問題はありませんでした。数日前に最新の更新プログラムがサーバーにインストールされました(Windows Server 2003 )そしてサイトを壊しました。コードスニペットは以下の通りです。

Dim oHttp
Dim strResult
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
oHttp.setOption(2) = 13056
oHttp.open "POST", SOAP_ENDPOINT, false
oHttp.setRequestHeader "Content-Type", "application/soap+xml; charset=utf-8"
oHttp.setRequestHeader "SOAPAction", SOAP_NS + "/" & SOAP_FUNCTION
oHttp.send SOAP_REQUEST

以下はエラーオブジェクトのダンプです:-

番号:-2147012852説明:クライアント認証を完了するには証明書が必要ですメッセージ:クライアント認証を完了するには証明書が必要です

最初は、Payment GatewayのSSL証明書が認証されていないか、クライアント証明書が必要だったためだと思いました。サーバーのブラウザーでURLをテストしたところ、エラーなしで正しく表示され、PaymentGatewayサーバーがクライアント証明書を必要としないことを確認しました。

私は途方に暮れています。私が行ったすべての研究は私をどこにも導きませんでした。 Stackoverflowで見つかった次のものも試しました:-

XMLHTTPをHTTPSで動作させる

xmlHttp、XMLリクエスト、asp

最後の1つは、サーバーがクライアント証明書を必要としない場合でもクライアント証明書が必要であると述べ、クライアント証明書のインストール方法に関するKB記事を示しましたが、それは古く、機能しません。

11
Imraan

oHttp.setOption 2, 13056を追加してみてください

8
Control Freak

テストに合格したこれに対する解決策を見つけました:

  • Windows 10(IIS 10)
  • Windows 2012 R2(IIS 8.5)

それはクライアントの問題です。 OPが指摘したように、MSXML2.ServerXMLHTTPでは、SSLで保護されたエンドポイントを呼び出すときにクライアント証明書を使用する必要があります(エンドポイントがそれを必要としない場合でも)。

Webサーバーでは、次のことを行う必要があります。

  1. クライアント証明書を作成する
  2. 証明書にアクセス許可を割り当てる
  3. ServerXMLHTTPオブジェクトに証明書を設定します

詳細に:

1。クライアント証明書を作成します

次のPowerShellコマンドを使用して、新しい自己署名証明書を作成します。

New-SelfSignedCertificate -DnsName "ServerXMLHTTP", "ServerXMLHTTP" -CertStoreLocation "cert:\LocalMachine\My"

このコマンドで作成された証明書は1年間のみ有効であることに注意してください。

2。証明書にアクセス許可を割り当てます

MMCを使用して、コンピューターアカウントの証明書ストアを表示します。 方法:MMC =スナップイン

上で作成した証明書は、Certificates(Local Computer)\ Personal\Certificatesにあります([IssuedBy]列と[IssuedTo]列には「ServerXMLHTTP」と表示されます。 ")。

ServerXMLHTTP証明書を右クリックし、[すべてのタスク]-> [秘密鍵の管理]を選択すると、アクセス許可ダイアログが表示されます。

ASP Webサイトアプリプールが実行されているユーザーを追加します。デフォルトでは「ApplicationPoolIdentity」として実行されますが、セットアップでは特定のユーザーアカウントを使用している可能性があります。アプリプールが使用している場合ApplicationPoolIdentity、追加するユーザー名は「IIS AppPool\APP POOLNAME」です。例:IIS AppPool\DefaultAppPool

ユーザーには、選択を解除できる「フルコントロール」が追加されます。 「読み取り」権限のみが必要なようです。 「OK」をクリックして権限を確認します。

3。 ServerXMLHTTPオブジェクトに証明書を設定します

ASPコードで、上記で作成した証明書を使用するようにServerXMLHTTPオブジェクトを設定します。たとえば、アクセストークンに対してPaypalを呼び出します。

Dim strAuthToken: strAuthToken = "<Base64 encoded version of ClientId:Secret>"
Dim oHttp: Set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")

With oHttp
    Call .Open("POST", "https://api.sandbox.Paypal.com/v1/oauth2/token", False)
    Call .SetOption(3, "LOCAL_MACHINE\My\ServerXMLHTTP")
    Call .SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    Call .SetRequestHeader("Authorization", "Basic " & strAuthToken)
    Call .Send("grant_type=client_credentials")
End With

うまくいけば、これはまだ助けになります。

3
bambam

私はそれが古い質問であることを知っています。この問題は、サポートされていない暗号スイートが原因である可能性があります。追加してみてください-TLS_RSA_WITH_AES_128_CBC_SHAAES128-SHA-TLS_RSA_WITH_AES_256_CBC_SHA AES256-SHA

つまり、次のkbに従う必要があります。 http://support.Microsoft.com/kb/94896 この更新プログラムは、Windows 2003をまだ使用している場合にも興味深いものです。これにより、SHA2を使用してサイトに接続できるようになります。 - http://support.Microsoft.com/kb/9687

Windows Server 2003のサポートは2015年7月14日に終了することに注意してください

0
Sunil

以下のようにoHttp.setOption(3)= "証明書ストア名/証明書のフレンドリ名"で試してみてください。これがうまくいくことを願っています。

Dim oHttp                    
Dim strResult 
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
oHttp.setOption(2) = 13056
oHttp.setOption(3) = "certificate store name/friendlyname of certificate"
oHttp.open "POST", SOAP_ENDPOINT, false
oHttp.setRequestHeader "Content-Type", "application/soap+xml; charset=utf-8"
oHttp.setRequestHeader "SOAPAction", SOAP_NS + "/" & SOAP_FUNCTION
oHttp.send SOAP_REQUEST
0
Gaurav

これはおそらくServerFault.comの質問です。結局のところ、コードが正常に機能していれば、プログラム上の問題ではありません。

しかし、私はいくつかのことを試みます。最初にProgID「MSXML2.ServerXMLHTTP.3.0」を使用してみてください。状況によっては、コンポーネントのインスタンス化に使用されたProgIDに応じてMSXML3の動作が異なります。また、アンチウイルスサプライヤ(ソフォスではこの問題が発生していました)などの他のソースからの更新により、MSXMLのインストールが中断される可能性があります。

試してみるもう1つのProgIDは、MSXML6をインストールした後の「MSXML2.ServerXMLHTTP.6.0」です。問題がMSXML3コアの更新にある場合は、MSXML6コアに同じ問題がない可能性があります。

0
AnthonyWJones