15

Java SE 6ドキュメントのOracleの「HttpAuthentication」ページには、「ドメインユーザーとしてWindowsマシンで実行している場合、またはkinitコマンドを発行してクレデンシャルキャッシュを取得しているLinuxまたはSolarisマシンで実行している場合」と記載されています。 「その後、「渡されたインスタンスはAuthenticator.setDefault()完全に無視されます」。

これは私が観察したものと一致します。WindowsシステムでホストXにHTTPまたはHTTPS接続を設定すると、Windows 7の「クレデンシャルマネージャー」に表示されるように、「Windowsボールト」の「Windowsクレデンシャル」からホストXのクレデンシャルが常に渡されます。コントロールパネルページ。

ただし、私のユースケースでは、Windowsによって保存される可能性のあるクレデンシャルは使用したくありませんが、代わりに、コードで明示的に指定したクレデンシャルを常に使用します。

文書化された動作を上書きする方法はありますか?つまり、Windowsによって保存された資格情報を無視する方法はありますか?

更新:そうでない場合、保存されているWindowsクレデンシャルを無視できないことがわかるJava SE 6ソースコード内の場所を誰かに教えてもらえますか?

4

4 に答える 4

7

少なくともJava7には、sun.net.www.protocol.http.ntlm.NTLMAuthenticationCallbackこの状況に役立つと思われるというクラスがあります。シングルサインオンは、「信頼できる」URLに対してのみ呼び出されます。

これをオフにする最も簡単な実装は次のとおりです(HTTP接続を開く前にこのイニシャライザーを呼び出します)。

static {
    NTLMAuthenticationCallback.setNTLMAuthenticationCallback(new NTLMAuthenticationCallback()
    {
        @Override
        public boolean isTrustedSite(URL url)
        {
            return false;
        }
    });
}

デフォルトの実装はすべてを信頼することだと思います:(

于 2013-02-05T04:27:38.130 に答える
6

私はあなたが求めているのと同じものを探しました。これまでのところ、JDKでそれを行う方法を見つけていません。

Javaバグデータベースの拡張要求があります。レポートを見て、Sunからの応答があるかどうかを確認します(レポートに投票して、すぐに修正されることを願っています)。

私がやったのは、オーバーライドsun.net.www.protocol.http.NTLMAuthenticationクラスでした。を見sun.net.www.protocol.http.HttpURLAuthenticationて、変更する必要があるのは次の結果だけであることがわかりました。

NTLMAuthentication.supportsTransparentAuth()

このメソッドには、trueWindowsプラットフォームなどで、ハードコードされた戻り値がありfalseます。このコードは、Windows7にインストールされているJDKから抽出されています。

static boolean supportsTransparentAuth()
{
  return true;
}

その方法は、Windowsクレデンシャルをデフォルトで使用する必要があるかどうかを示しています。に設定するtrue、カスタムオーセンティケーターコードは呼び出されませんHttpURLConnectionクラスのこのフラグメントを参照してください。

//Declared as a member variable of HttpURLConnection
private boolean tryTransparentNTLMServer = NTLMAuthentication.supportsTransparentAuth();

//Inside of getServerAuthentication method.
PasswordAuthentication a = null;
if (!tryTransparentNTLMServer) {
    //If set to false, this will call Authenticator.requestPasswordAuthentication().
    a = privilegedRequestPasswordAuthentication(url.getHost(), addr, port, url.getProtocol(), "", scheme, url, RequestorType.SERVER);
}

/* If we are not trying transparent authentication then 
* we need to have a PasswordAuthentication instance. For
* transparent authentication (Windows only) the username 
* and password will be picked up from the current logged 
* on users credentials.
*/
if (tryTransparentNTLMServer || (!tryTransparentNTLMServer && a != null)) {
    //If set to true or if Authenticator did not return any credentials, use Windows credentials.
    //NTLMAuthentication constructor, if receives a == null will fetch current looged user credentials.
    ret = new NTLMAuthentication(false, url1, a);
}

NTLMAuthenticationソースコードを取得するために、このJavaデコンパイラーを使用しました。JDKインストールフォルダにあるrt.jarを開き、目的のクラスコードをコピーしました。

次に、supportsTransparentAuthfalseを返すように変更しました。ただし、このメソッドが最初にシステムプロパティをチェックし、次にそれに基づいてtrueまたはfalseを返す場合は非常に望ましいでしょう。

コンパイルするには、Javaファイルをsun / net / www / protocol / httpフォルダー構造の下に配置し、次のコマンドを実行します。

javac NTLMAuthentication.java

次に、以下を使用してアプリケーションを実行します。

java -Xbootclasspath:"path/to/your/sun/net/www/protocol/http/classes;normal/JDK/boot/directories"

これにより、JVMNTLMAuthenticationはrt.jarの実装の前に実装をロードするようになります。を使用したデフォルトのクラス読み込みパスを見逃さないように注意する必要があります。そうしないと-XbootclasspathClassNotFoundエラーが発生します。

その後、すべてが正常に機能しました。

このアプローチには、注意すべき重要な欠点があります。

  • セキュリティ上のリスクがあります。だれでも別の.classファイルをブートフォルダにドロップして、ユーザーの資格情報やその他の重要な情報を盗む可能性があります。
  • Sunパッケージのコードは予告なしに変更される可能性があるため、変更内容と互換性がありません。
  • このコードをデプロイすると、Sunコードライセンスに違反することになります。ドキュメントから:

-Xbootclasspath:bootclasspathブートクラスファイルを検索するためのディレクトリ、JARアーカイブ、およびZIPアーカイブのセミコロン区切りのリストを指定します。これらは、Java2SDKに含まれているブートクラスファイルの代わりに使用されます。注:rt.jarのクラスをオーバーライドする目的でこのオプションを使用するアプリケーションは、Java 2 RuntimeEnvironmentのバイナリコードライセンスに違反するため、デプロイしないでください。

したがって、これは実稼働環境には絶対に適していません。

最後に、これはブートクラスパスオプションとJavaクラスローダーに関する優れた情報源です:PDF

お役に立てれば。

于 2012-01-26T20:21:33.273 に答える
2

クラスsun.net.www.protocol.http.ntlm.NTLMAuthenticationCallbackがjava6.0パッチ24以降に追加されたため、提案されたソリューションはjava6.0でも機能するようです。次の投稿の参照を参照してください:http: //www.mail-archive.com/users@cxf.apache.org/msg22897.html

于 2013-04-04T12:49:50.373 に答える
1

Java v8 212以降では、このCVEの結果として、NTLMv2を介した「透過的な」SSO認証がデフォルトで無効になっています:https ://nvd.nist.gov/vuln/detail/CVE-2019-2426 。詳細情報:URLの呼び出し中にntlm認証を提供するにはどうすればよいですか?

于 2019-05-21T12:35:30.240 に答える