注:私はなんとか進歩を遂げました。現在の質問の編集を参照してください。ありがとうございます。
Windows で libcurl を使用して、Kerberos/GSSAPI 認証で Web サイトにアクセスしたいと考えています。最初は MIT Kerberos で解決しようとしましたが、SSPI を使用した NTLM 認証も必要です (libcurl は 2 つの異なる実装からの両方の使用をサポートしていません)。そのため、Windows SSPI ライブラリを使用して Kerberos で認証しようとしています。SSPI と SPNEGO をサポートする libcurl をコンパイルすることができました。
今私の問題は、提供された資格情報を使用して提供されたレルムに接続する必要があることです(現在のユーザーのレルムまたは別のレルムである可能性があります)。私が理解したことから、Kerberos チケットを取得するには、secur32.dll/security.dll から AcquireCredentialsHandle と InitializeSecurityContext を呼び出す必要があります。
しかし、それを機能させようとするたびに、私は:
- SSPI キャッシュで提供された資格情報/レルムの DC からチケットを取得しないでください (エントリを表示するために kerbtray.exe を使用しています)。
- これらのメソッドを使用する場合、このキャッシュにチケットが表示されますか?
- InitializeSecurityContext/AcceptSecurityContext のクライアント/サーバー ループバックで ImpersonateSecurityContext を呼び出した後に libcurl を使用し、Wireshark でパケットを確認すると、libcurl は提供された資格情報を使用せず、代わりに NTLM にフォールバックすることがわかります (認証が失敗するだけです)。 )
- ループバック クライアント/サーバーは正しい動作ですか (Web 上で他の実装例を見つけることができませんでした)。
- 偽装が成功したと仮定して、libcurl はスレッドの偽装された資格情報を使用する必要がありますか?
- libcurl は NTLM + Kerberos と SSPI をまったくサポートしていますか?
デバッグとテストを容易にするために、MIT Kerberos ライブラリの kinit など、SSPI キャッシュにエントリを追加するツールを知っていますか? Windows Server 2003 Resource Kit Tools を使用していますが、そのようなツールが見つかりませんでした...
どんな助けでも大歓迎です!
編集
よし、libcurlを使って欲しいものを作る方法を見つけました。最後に、事前に SSPI で何らかの作業を行う必要があると想定していましたが、curl はそれを適切にサポートしています。
curl は、適切にビルドされたバージョンの curl を SSPI および SPNEGO フラグとともに使用すると、kerberos レルムに対する認証を行い、LSA キャッシュに保存します。
curl.exe を使用してテストする場合、ユーザー名/パスワードとともに--negotiate引数を指定する必要があります。ただし、libcurl を使用する場合は、単に CURLOPT_HTTPAUTH オプションを CURLAUTH_GSSNEGOTIATE を含むもの (CURLAUTH_ANY など) に設定するだけです。私のテストでは、libcurl は予想される Kerberosハンドシェイクを実行しました。
- Web サーバー (web.b.com、B.COM は Web サーバーの kerberos レルム) に接続します。
- WWW-AuthenticateパラメータがNegotiateに設定された、許可されていない応答を受信しました
- libcurl/SSPI は、TGS-REQ を現在のユーザーのドメインのドメイン コントローラー (DC) (A.COM としましょう) に送信します。
- どういうわけか、次の TGS-REQ は Web サーバー (B.COM) のドメイン コントローラーに送信されます。
- ドメイン B.COM の Kerberos チケットを受信し、エントリが LSA キャッシュに追加されます (klist.exe または kerbtray.exe で表示可能)
- libcurl は、認証情報 (GSS-API) を使用して Web サーバーに HTTP 要求を送信します。
ただし、ここに私の新しい問題があります。このハンドシェイクはすべて、現在ログに記録されている資格情報、たとえばuser1@A.COMで行われました。A.COM と B.COM の間には信頼関係があり、私のユーザーはアクセスできるため、機能します。提供された資格情報 ( user2.B.COM ) を使用してログインしたいのですが?
また、現在ログに記録されているユーザーとは異なるユーザーの LSA キャッシュにエントリを追加できるかどうかはよくわかりません??
libcurl がこのユーザーに関連付けられたチケットにアクセスして Web サーバーに認証されるように、ユーザーuser2.B.COMになりすましてこれを機能させるにはどうすればよいですか?