プロパティを持つssl接続のホスト名検証を標準のjava SSLソケットで無効にする方法はありますか?今まで私が見つけた唯一の方法は、常に真を返すホスト名検証を書くことです。Java SSL:ホスト名の検証を無効にする方法
WebLogicは、この可能性を提供し、次のプロパティとホスト名の検証を無効にすることが可能である:
-Dweblogic.security.SSL.ignoreHostnameVerify
プロパティを持つssl接続のホスト名検証を標準のjava SSLソケットで無効にする方法はありますか?今まで私が見つけた唯一の方法は、常に真を返すホスト名検証を書くことです。Java SSL:ホスト名の検証を無効にする方法
WebLogicは、この可能性を提供し、次のプロパティとホスト名の検証を無効にすることが可能である:
-Dweblogic.security.SSL.ignoreHostnameVerify
確かにそこには、ホスト名の検証は、標準のJava SSLソケットではありませんかSSLを使用しているため、そのレベルで設定することはできません。ホスト名の検証は、HTTPS(RFC 2818)の一部です。そのため、HttpsURLConnectionに適用されるjavax.net.ssl.HostnameVerifierとしてそれ自身が現れます。
import javax.net.ssl.*;
import java.lang.instrument.Instrumentation;
public class LenientHostnameVerifierAgent {
public static void premain(String args, Instrumentation inst) {
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(String s, SSLSession sslSession) {
return true;
}
});
}
}
それからちょうどプログラムのJavaの起動引数に--javaagent:LenientHostnameVerifierAgent.jar
を追加します。
しかし、Weblogicがそのようなスイッチを提供する理由とHttpsURLConnectionレベルにそのようなプロパティが存在しないのはなぜですか? – paweloque
@lewap私はこれらが修辞的な質問であると思いますか?私はWebLogicについての質問、あるいはなぜJDKがそうであるかについての質問に答えることはできません。 WebLogicのことは私のセキュリティホールのように見えますが、JDKではそれを望みません。 – EJP
彼らは全く修辞的ではありません。私はSSLの仕組みを理解し、jdkとweblogicの違いを理解しようとしています。多分それには理由があるかもしれません。 – paweloque
デフォルトHostnameVerifier
をオーバーライドするカスタムjava agentを作成することが可能でなければなりません。
これはこれを処理する素晴らしい方法かもしれませんが、私はApacheのhttpクライアントを扱っています。 'SSLSocketFactory.setHostnameVerifier(new AllowAllHostnameVerifier())'を設定するjavaagentをどのように作成できますか? –
@ end-user、この回答の場合とまったく同じです。 – Vadzim
RESTful Webサービスにアクセスしているときにも同じ問題がありました。そして、私は問題を克服するためのコードを以下に示します:
public class Test {
//Bypassing the SSL verification to execute our code successfully
static {
disableSSLVerification();
}
public static void main(String[] args) {
//Access HTTPS URL and do something
}
//Method used for bypassing SSL verification
public static void disableSSLVerification() {
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
} };
SSLContext sc = null;
try {
sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
}
}
私のために働いていました。それを試してみてください!!
あなたのものは私が考えることができる最もクリーンなソリューションです。それに何か問題がありますか? – Piskvor
まあ、チェックを無効にして、コードを変更せずにこれを行うだけです。通常、あなたはSSL接続を制御する多くのプロパティを持っていますが、この場合は明らかにそうではありません... – paweloque
あなたはカスタムプロパティをチェックし、 "always-ok"ダミーベリファイアを返すホスト名ベリファイア*設定されている場合はデフォルトベリファイア、そうでない場合はデフォルトベリファイア、しかし、これは実際に問題を解決するものではありませんか? – Piskvor