5

私はリクエストを送信しようとしています:

ActiveXObject("WinHttp.WinHttpRequest.5.1")

ただし、これにはクライアント証明書が必要です (提供されています)。

PHP cURL でテストしたので、次のようにできます。

curl_setopt($SOAP, CURLOPT_SSLCERT,$filepathtocertificate);

これはうまくいきます。ただし、asp(javascript) を実行している IIS を使用し、スクリプトが実行されているマシンの証明書ストアを指す必要があります。

 SetClientCertificate("LOCAL_MACHINE\\Personal\\Certificate subject");

実際の展開のために。MS のドキュメント ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa384055(v=vs.85).aspx ) は、上記のパスに証明書の「サブジェクト」を記載する必要があることを示唆しています。 、しかし、証明書にはいくつかのサブジェクトがあり、それらのいくつかまたはすべての組み合わせが結果をもたらさないようであり、リクエストが送信される前に次のエラーが発生します。

WinHttp.WinHttpRequest error '80072f0c'

A certificate is required to complete client authentication

証明書ストアを調べて、同じフォルダー内の他のスクリプトを使用すると、それらは間違いなくそこにあることが示されますが、次のような件名があります。

C=US, O=Organisation NAme, OU="Another Organisation Name, Inc.", CN=Organisation Name Root

または類似。

証明書ストアで証明書を選択して送信するために SetClientCertificate を指定する必要があるパラメーターについてのアドバイスをいただければ幸いです。

4

2 に答える 2

2

これは非常に古い質問ですが、今日は答えを見つけなければなりませんでした。上記の@JSLによる回答が役に立ちました。証明書のサブジェクト名のみを指定すると、機能します! したがって、フルパスの指定方法に誤りがあることは明らかです。

このリンクから Windows 7 の正しい情報を入手しましたhttps://msdn.microsoft.com/en-us/library/windows/desktop/aa384076(v=vs.85).aspx

これが機能するVBAスクリプトです。

Dim objHttp As New WinHttp.WinHttpRequest
objHttp.Open "GET", url, False
objHttp.SetClientCertificate "CURRENT_USER\My\TestCert"
objHttp.send

有効な場所は LOCAL_MACHINE と CURRENT_USER で、有効なストア名は "MY"、"Root"、および "TrustedPeople" です。C++、C# などではバックスラッシュを忘れずにエスケープしてください。

于 2016-12-15T15:29:28.163 に答える