2011-07-13 46 views
6

自己署名入りのHTTPSサーバーに接続するいくつかのサンプルJavaプロジェクトを作成しようとしています。 Javaで証明書の検証をやめさせることはできません。私はこの証明書を信頼する必要はありません、私はちょうどすべての証明書の検証を無視したいです。このサーバーは私のネットワークの内側にあり、証明書が有効かどうかを気にせずにいくつかのテストアプリケーションを実行できるようにしたいと考えています。Javaは証明書の検証を無視します

java -Dcom.sun.net.ssl.checkRevocation=false HelloWorld 
org.apache.axis2.AxisFault: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

= falseを-Dcom.sun.net.ssl.checkRevocationは助けにはなりませんでした。

public static void DisableCertificateValidation() { 
    TrustManager[] trustAllCerts = new TrustManager[]{ 
    new X509TrustManager() { 
     public X509Certificate[] getAcceptedIssuers() { return null; } 
     public void checkClientTrusted(X509Certificate[] certs, String authType) { } 
     public void checkServerTrusted(X509Certificate[] certs, String authType) { } 
    } 
    }; 
    try { 
    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
    } catch (Exception e) { 
    } 
} 

しかし、まだ同じ問題を持っている:私はまた、次のコードを追加してみました。何が起きてる?

+0

axis2で証明書を無視できましたか? Josip – cromorrissey

答えて

10

org.apache.axis2.AxisFaultを使用すると、軸2を使用していることを示し、軸2は、そのHTTP(S)接続を行うことHttpsURLConnectionを使用していないのですが、Apache HttpClientを(3.xの私の知る限り)、そうHttpsURLConnection.setDefaultSSLSocketFactory(...)はありません持っていますそこに影響を与える。

あなたはより具体的には、この文書、2軸のためSSLContextの設定についてthis answerを見てすることができます:http://axis.apache.org/axis2/java/core/docs/http-transport.html#httpsupport

(または、あなたがSSLContext.setDefault(...)でデフォルトSSLContextを設定して逃げることができるかもしれませが、導入デフォルトのSSLコンテキストの証明書検証を無効にすることは、実際のアプリケーションでは明らかに良い考えではありません。)

+0

ああ、Axis2はHttpsUrlConnectionを使用していません。私はまだSSLContextをセットアップする方法がわかりません。圧倒的な量のドキュメンテーションがあります。なぜなら、どうにか私はそれがどこかの簡単なスイッチであるように感じるからです。 –

+0

'SSLContext.setDefault(sc)'を 'SSLContext.getInstance(" TLS ")'(または 'SSLContext.getInstance(" SSL ")'?)の値で追加すると、ここで動作するように見えます。 – sehe

3

これは古い質問ですが、私はそれを見つけて、ちょっと正しい方向に私を踏みとどめました。私はのparamsを設定することにより、有効なクライアント証明書なしのAxis2でHTTPSのURLにアクセスすることができます:

import org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory; 
import org.apache.commons.httpclient.protocol.Protocol; 

EasySSLProtocolSocketFactory easySSLProtocolSocketFactory; 
try { 
    easySSLProtocolSocketFactory = new EasySSLProtocolSocketFactory(); 
    Protocol.unregisterProtocol("https"); 
    Protocol.registerProtocol("https", new Protocol("https", 
        (ProtocolSocketFactory) easySSLProtocolSocketFactory, 443)); 
} 
catch (GeneralSecurityException e) { 
     e.printStackTrace(); 
} 

だけのAxis2サービスクライアントを呼び出す前に、これを行うようにしてください。これは私が本番では何もしませんが、私のためのトリックをした安全でないサーバーの高速ハックとして。

関連する問題