5

.PFXデジタル証明書 (ファイル) (NTLM 認証) を使用するか、Windows ドメイン認証 (Kerberos & ネゴシエート認証) を使用して、authentication を必要とする Web サイト (EXCEL VBA) の REST API とやり取りしたいと考えています。後者が推奨されますが、どちらの方法もわかりません。これらの認証のいずれかを行う方法について誰かがコードを共有できることを望んでいました。サポートされていないため、他の認証方法 (基本など) を使用できません。

現在、私は VBA-Web ( github:VBA-tools:VBA-Web) を使用しており、API とのインターフェイスに成功しましたが、非常に奇妙な方法でした。Chrome から Web サイトへのネットワーク呼び出しを追跡したところ、すべての呼び出しのヘッダーに Cookie が追加されていることがわかりました。したがって、私のリクエストでは、次のように追加します。

webrequest.SetHeader "Cookie", "server.com.au=35558896564.55846.54545; SDASESSION=AQISFCwMasdffczd6afASFVHfgfgsdf%2BG35FsE%3D%40AAJTSwAJSDFSDTkMw%3D%3D%23; amlbcookie=07; JSESSIONID=000f:19pcqj2d1; server2.com.au=484566584.454584.41545"

ただし、これは明らかに煩わしく、ユーザーフレンドリーではありません。Excel vba コードを使用するたびに Cookie を見つけなければならないからです。

さらに、Chrome で認証のネットワーク呼び出しを追跡した後、さまざまなリダイレクトを通過し、リダイレクトされるたびにすべての Cookie を収集していることに気付きました。1 つの特定の呼び出し中に、"negotiate"認証を行います。

VBA-Web は に基づいているようです。そのため、いろいろ調べてみましたが、これらの認証を行うために (または WinINet などと) やり取りWinHTTPする方法に本当に迷いました。メソッドLinkWinHTTPを見てきましたが、NTLM または Negotiate のユーザー名とパスワードがどうなるかわかりませんか?setCredentials

または、代わりにデジタル証明書を使用しようとしましたが、PFX ファイルがあるため、それを直接使用する方法がわかりません。Linkを見たことがありますが、PFX のインストール後に証明書がどこに保存されているか完全にはわかりません。インストール時に Personal を選択しましたが、これは LOCAL_MACHINE\Personal にあるということですか? さらに重要なことに、サブジェクト名が何であるかわかりません。

Microsoft のドキュメントはC++またはJScriptにあるため、どちらも役に立ちません。

したがって、認証して Cookie を取得できれば、残りは問題ありません。VBA を使用して、Excel で 2 つの認証方法のいずれかを使用してこれを行うにはどうすればよいですか?

PS私の質問が明確であることを願っています。ご不明な点がございましたらお気軽にお問い合わせください。私が見つけたすべての答えは基本認証に戻りますが、それはできません。私が接続しようとしている Web サイトを紹介したいと思いますが、それはイントラネット上にあります。

4

2 に答える 2

1

WinHttp.WinHttpRequest を使用して VBA から NTLM 認証を確実に実行できます。Microsoft WinHTTP サービスを VBA プロジェクトへの参照として追加する必要があります。

資格情報キャッシュが存在しない可能性があることを除けば、 powershell スクリプトを使用する場合とまったく同じです。問題ありません。SetAutoLogonPolicy、SetCredentials、またはSetClientCertificateを使用してください(有効な場所は CURRENT_USER または LOCAL_MACHINE だけです!) --これを参照してください-- 例SetClientCertificate("CURRENT_USER\Personal")

Dim auth As New WinHttp.WinHttpRequest

With auth   
.Open "GET", "https://xxx.yyy", False
.setRequestHeader "Accept", "application/json" ' this is only an example, you probably don't need to set this header
.setRequestHeader <Whatever Header You Want>, <Header Value>
.SetAutoLogonPolicy(AutoLogonPolicy_Always) ' WARNING: Only use this if you trust the host you're trying to login to
.SetClientCertificate("CURRENT_USER\Personal") ' This will use the first certificate in the "CURRENT_USER\Personal" store, this might just work as is if you have a managed domain account.
.send
cookie = .getResponseHeader("Set-Cookie")
End With

一部のホストはあなたをリダイレクトしているようで、そこで認証を行う必要があります。問題ありません。手動で (!!!) リダイレクトに従うだけです。自動リダイレクトを必ず無効にしてください。

Dim auth As New WinHttp.WinHttpRequest

With auth   
    .Open "GET", "https://xxx.yyy", False
    .setRequestHeader "Accept", "application/json" ' this is only an example, you probably don't need to set this header
    .setRequestHeader <Whatever Header You Want>, <Header Value>
    .SetAutoLogonPolicy(AutoLogonPolicy_Always) ' WARNING: Only use this if you trust the host you're trying to login to
    .SetClientCertificate("CURRENT_USER\Personal") ' This will use the first certificate in the "CURRENT_USER\Personal" store, this might just work as is if you have a managed domain account.
    .Option(WinHttpRequestOption_EnableRedirects) = False
    .send

    While .Status = "302" ' got redirected
        redirectLocation = .getResponseHeader("Location")
        ' Here you play the same game above until you get a proper session cookie
    Wend

End With

場合によっては、後続の http 要求でその Cookie を使用する必要があるため、リダイレクトのたびに、取得した応答 Cookie を保存することをお勧めします。

特定のホストが ntlm でどのように認証されるかを確認する最も簡単な方法は、ブラウザーで開発者ツールを使用してネットワークを監視することです。必要なすべての要求が表示されます。

PS ほとんどの場合、証明書を使用しても Cookie は生成されないため、同じ手順に従うだけで、有効な証明書がある場合は Cookie を保存する必要はありません。

于 2020-10-22T08:41:24.837 に答える