お客様に 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 プロキシでは機能しない理由がわかりません。