读书人

javax.net.ssl.SSLHandshakeException

发布时间: 2011-11-13 21:39:11 作者: rapoo

java https请求问题
jdk1.4.2
使用httpclient 向一个用https的网站发起一个请求
报错如下
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SunJSSE_az.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SunJSSE_az.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SunJSSE_ax.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.j(DashoA6275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA6275)
at com.sun.net.ssl.internal.ssl.AppOutputStream.write(DashoA6275)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:66)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:124)
at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:827)
at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:1975)
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:993)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324)
已经从那个网站上面把证书下载了,用keytool导入证书
用keytool 导入了 证书
keytool -import -trustcacerts -keystore c:\ca.jks -file c:\ca.cer

依然是报上面的错误
请高手指教,谢谢!

[解决办法]
如果使用标准的URL是可以这样指定信任https的

Java code
import java.net.URL;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.*;public class TrustSSL {    private static class TrustAnyTrustManager implements X509TrustManager {            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {        }            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {        }            public X509Certificate[] getAcceptedIssuers() {            return new X509Certificate[]{};        }    }        private static class TrustAnyHostnameVerifier implements HostnameVerifier {        public boolean verify(String hostname, SSLSession session) {            return true;        }    }    public static void main(String[] args) throws Exception {        SSLContext sc = SSLContext.getInstance("SSL");        sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());        URL console = new URL("https://server:8080/login");        HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();        conn.setSSLSocketFactory(sc.getSocketFactory());        conn.setHostnameVerifier(new TrustAnyHostnameVerifier());        conn.connect();        System.out.println(conn.getResponseCode());    }} 

读书人网 >J2EE开发

热点推荐