您的位置:首页 > 理论基础 > 计算机网络

Java https服务器认证问题的解决方法

2016-03-08 11:05 585 查看

Java https服务器认证问题的解决方法

java访问https出现如下错误:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed

原因

由于Java自带根证书库中不包含此HTTPS服务器上的根证书,导致认证失败。

解决方案

有两种:

1、导入服务器证书到本地Java环境

2、代码中忽略证书信任问题

第二种方案会有安全性问题,一般不推荐。

证书导入注意事项

将服务器的根证书导入到Java运行环境的根证书库中,能解决对应的服务器https连接问题。

实现方式是使用$JAVA_HOME/jre/bin下的keytool工具将服务器端的证书添加到jre/lib/security/cacerts文件中。

需要注意的是:

确定当前Java程序所用的java运行环境jre的路径(可能为jdk下的jre,也可能是单独的jre)。

确定有jre/lib/security/cacerts文件的写入权限(可以用管理员权限运行keytool)。

导入证书详细步骤:

1. 获取服务器端的证书文件

可以使用浏览器打开服务器网站页面,然后导出证书文件,假设导出的证书文件为test.crt 。

2. 生成keystore文件

利用keytool生成密钥文件keystore:

keytool -importcert -noprompt -trustcacerts -alias test -file mycer.cer -keystore mykeystore

这里要设置口令。

3. 导入证书到Java运行时环境

将证书导入jre/lib/security/cacerts:

keytool -importkeystore -srckeystore ~/keystore -destkeystore [path_jre]/lib/security/cacerts

会要求输入目标密钥库口令(也就是jre/lib/security/cacerts 的口令,默认是changeit或者changeme),以及源密钥库口令(之前设置的口令).

最后会显示是否导入成功。如果成功则重启Java程序。

忽略证书信任代码:

// Create a trust manager that does not validate certificate chains

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){}

}};

// Install the all-trusting trust manager

SSLContext sc = SSLContext.getInstance("TLS");

sc.init(null, trustAllCerts, new SecureRandom());

HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: