NegotiateStreamはKerberosを使用して取得するには?
-
19-09-2019 - |
質問
この質問を求めた後、私はNegotiateStreamを使用しようとしてきましたJavaサーバーに対して、Windowsクライアントを認証します。これは、Javaは偉大NTLMライブラリをサポートしていないので、私は、私は(GSS-APIを経由して)はるかに優れたサポートするために、Javaは思わ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>
私が何か間違ったこと、または完全にこのようなものを誤解していますか? :)
解決
SPN名の完全な構文は<service>/<user>@DOMAIN
です。どうやら、ドメイン名を省略することができます。ユーザ名がmy-pc-name.domain-name
ある場合は、その後、あなたはそれをさらに短縮するべきではありません - 。spn -L
はあなたにそれを示しています正確にSPNを提供