1、报错原因
用浏览器可以正常访问,用httpclient不可以,是因为javaSSL证书校验失败,即java验证对方HTTPS证书时找不到完整的信任链。而浏览器对比java,会自动补全中间证书、使用系统的信任库、有更宽松的兼容策略。
若在开发的调试过程中,可以采用以下方法跳过验证。
public class SSLUtil {
public static void ignoreSSL() throws Exception {
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) {}
}
};
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
}
}
//方法调用
SSLUtil.ignoreSSL();
2、解决方法
(1) 下载证书
访问https连接,在浏览器左侧会发现安全锁的标志,点击安全锁弹出如图对话框:

点击连接安全之后,点击图中证书标志,之后导出证书到本地。

(2) 导入到java库
在cmd或者powerShell中使用以下命令导入证书,导入过程中会显示是否信任此证书,输入y后回车即可。
keytool -import -alias XXX //文件命名
-file XXXX.crt //已下载的证书文件
-keystore "XXX\jre\lib\security\cacerts" //java的秘钥库文件
-storepass changeit //默认密码
导入成功后再次连接验证发现无报错。