この質問をした後、私はNegotiateStreamを使用してJavaサーバーに対してWindowsクライアントを認証しようとしています。Javaは優れたNTLMライブラリをサポートしていないようです。そのため、Javaが(GSS-APIを介して)はるかに優れていると思われるKerberosを使用する必要があると想定して取り組んできました。
問題は、NegotiateStreamが毎回NTLMを使用しようとしているように見えることです。ドキュメントは、どちらも使用できることを示唆していますが、選択方法は指定されていません。選択するメカニズムを制御するためのAPIのオプションが表示されません。方法はありますか?
私は自分自身にサービスプリンシパル名を持っており、私のクライアントコードは次のようになっています。
string spn = "<service-name>/<my-pc-name>"
TcpClient client = new TcpClient(server, port);
NetworkStream stream = client.GetStream();
NegotiateStream neg = new NegotiateStream(stream, true);
neg.AuthenticateAsClient(CredentialCache.DefaultNetworkCredentials, spn);
サーバー側では、最初に受信したバイトのセットは22,1,0,0,59で、次に「NTLMSSP」です。これは私が予期していなかったことです。
SPN文字列に対していくつかの異なる形式を試しましたが、正しい形式が何であるかわかりません。私はもともとSPNを作成しました
setspn -A <service-name>/<my-pc-name>.<domain-name> <my-user-name>
setspn -Lは、次のように正常にリストします。
TEST/<my-pc-name>.<domain-name>
私は何か間違ったことをしているのですか、それともこのことを完全に誤解していますか?:)