2011-07-13 198 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 

-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轴,和Axis 2不使用HttpsURLConnection使其HTTP(S)连接,但是Apache的HttpClient(3.x作为据我所知),所以HttpsURLConnection.setDefaultSSLSocketFactory(...)不会有任何效果在那里。

你可以看看this answer大约为2轴设立SSLContext,更具体地讲,这个文件:http://axis.apache.org/axis2/java/core/docs/http-transport.html#httpsupport

(或者,您可以用SSLContext.setDefault(...)设置默认SSLContext脱身介绍在Java 6.禁用证书验证你的默认SSL上下文显然不是一个真正的应用程序中的好主意。)

+0

啊,所以Axis2不使用HttpsUrlConnection,这个解释很多!呃......我仍然不确定如何在这里设置SSLContext,这种文档的数量非常大,我遇到了麻烦,因为不知何故,我觉得它应该是一个简单的开关。 –

+0

事实上,在SSLContext.getInstance(“TLS”)(或SSLContext.getInstance(“SSL”)?)的值中加入'SSLContext.setDefault(sc)'似乎可以在这里工作。 – 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服务客户端之前做到这一点。这不是我在制作中会做的事情,而是作为一个快速入侵的不安全服务器,它为我做了窍门。