当前位置: 代码迷 >> J2EE >> javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException
  详细解决方案

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException

热度:912   发布时间:2016-04-22 02:53:24.0
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());    }}
  相关解决方案