2011-05-17 20 views
28

プロパティを持つssl接続のホスト名検証を標準のjava SSLソケットで無効にする方法はありますか?今まで私が見つけた唯一の方法は、常に真を返すホスト名検証を書くことです。Java SSL:ホスト名の検証を無効にする方法

WebLogicは、この可能性を提供し、次のプロパティとホスト名の検証を無効にすることが可能である:

-Dweblogic.security.SSL.ignoreHostnameVerify

+1

あなたのものは私が考えることができる最もクリーンなソリューションです。それに何か問題がありますか? – Piskvor

+1

まあ、チェックを無効にして、コードを変更せずにこれを行うだけです。通常、あなたはSSL接続を制御する多くのプロパティを持っていますが、この場合は明らかにそうではありません... – paweloque

+0

あなたはカスタムプロパティをチェックし、 "always-ok"ダミーベリファイアを返すホスト名ベリファイア*設定されている場合はデフォルトベリファイア、そうでない場合はデフォルトベリファイア、しかし、これは実際に問題を解決するものではありませんか? – Piskvor

答えて

3

確かにそこには、ホスト名の検証は、標準の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を追加します。

+0

しかし、Weblogicがそのようなスイッチを提供する理由とHttpsURLConnectionレベルにそのようなプロパティが存在しないのはなぜですか? – paweloque

+0

@lewap私はこれらが修辞的な質問であると思いますか?私はWebLogicについての質問、あるいはなぜJDKがそうであるかについての質問に答えることはできません。 WebLogicのことは私のセキュリティホールのように見えますが、JDKではそれを望みません。 – EJP

+3

彼らは全く修辞的ではありません。私はSSLの仕組みを理解し、jdkとweblogicの違いを理解しようとしています。多分それには理由があるかもしれません。 – paweloque

23

デフォルトHostnameVerifierをオーバーライドするカスタムjava agentを作成することが可能でなければなりません。

+1

これはこれを処理する素晴らしい方法かもしれませんが、私はApacheのhttpクライアントを扱っています。 'SSLSocketFactory.setHostnameVerifier(new AllowAllHostnameVerifier())'を設定するjavaagentをどのように作成できますか? –

+0

@ end-user、この回答の場合とまったく同じです。 – Vadzim

3

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);   
    } 
} 

私のために働いていました。それを試してみてください!!

+0

この解決法は私のためには機能しませんでした。 – seanmcl

+3

これはすべての証明書を安全に信頼しますが、ホスト名検証をバイパスするものではありません。 – EJP