6

お客様に Java クライアント側アプリケーションをデプロイしています (アプレットではなく Java アプリケーション)。このアプリケーションは、url.openConnection() で接続をチェックし、インターネット経由で Web サービス (CXF/JAX-WS を使用) を呼び出します。

一部の顧客ネットワークでは、プロキシを使用して外部世界にアクセスしています。クライアント側アプリケーションは、Java システム プロパティでプロキシ パラメータを設定します。

System.setProperty("proxySet", "true");   //Obsolete ?
System.setProperty("http.keepAlive", "false");
System.setProperty("java.net.useSystemProxies", "false");
System.setProperty("https.proxyHost", httpsProxyHost);
System.setProperty("https.proxyPort", httpsProxyPort);
System.setProperty("https.proxyUser", httpsProxyUser);
System.setProperty("https.proxyPassword", httpsProxyPassword);
System.setProperty("http.proxyHost", httpProxyHost);
System.setProperty("http.proxyPort", httpProxyPort);
System.setProperty("http.proxyUser", httpProxyUser);
System.setProperty("http.proxyPassword", httpProxyPassword);

Authenticator.setDefault(new NtlmAuthenticator(httpsProxyUser, httpsProxyPassword));

NtlmAuthenticator クラス:

public class NtlmAuthenticator extends Authenticator {

private final String username;
private final char[] password;

public NtlmAuthenticator(final String username, final String password) {
    super();
    this.username = username;
    this.password = password.toCharArray(); 
}

public PasswordAuthentication getPasswordAuthentication() {
    return (new PasswordAuthentication (username, password));
}

}

Java 6 (JRE 1.6.0_39 を埋め込んだクライアント側アプリケーション) を使用しており、アプリケーションは Windows (XP / Seven) にデプロイされています。NTLM プロトコルが Windows プラットフォームで 1.4.2 以降サポートされていることを読みました。したがって、Trend プロキシを使用してテストを行い、NTLM プロキシ認証の実行に成功しました (Wireshark NTLMSSP_NEGOCIATE (アプリから) / NTLMSSP_CHALLENGE (プロキシから) / NTLMSSP_AUTH (アプリから) の 3 つのパケットが表示されます)。

しかし、Bluecoat プロキシを使用している顧客の 1 人では、NTLMSSP_CHALLENGE の後に NTLM 認証が失敗しました。Wireshark では、最初の 2 つのパケット NTLMSSP_NEGOCIATE (アプリから) と NTLMSSP_CHALLENGE (プロキシから) のみが表示され、NTLMSSP_AUTH はアプリケーションによって送信されません。アプリケーションで SocketException をキャッチします: ソケットが閉じられています

また、jCIFS HttpUrlNltmHandler を使用しようとしましたが、認証も失敗しました (同じ診断)。

同様の問題でこのスレッドを見つけましたが、手がかりはありません。NTLMセッションセキュリティに関するこのスレッドも見つけました

何か案は ?

ありがとう。

http.keepalive を true に設定するだけで解決策が見つかります: System.setProperty("http.keepAlive", " true ");

しかし、偽の値を使用すると、Trend プロキシでは機能し、顧客の bluecoat プロキシでは機能しない理由がわかりません。

4

1 に答える 1

1

これは、基盤となる実装のバグによるものです。Java 6 NTLM プロキシ認証と HTTPSで説明されています。

于 2013-07-25T12:20:04.920 に答える