为什么我需要在java中导入服务器证书

时间:2016-08-20 07:30:41

标签: java ssl

我们开发了一个控制台应用程序,它将从HTTPS上的ESB(https://esb.mkcl.org/)中获取数据。当我点击这个网站时,我得到javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated例外。我将网址更改为https://netbanking.hdfcbank.com/netbanking/,这也是在HTTPS上,在点击后我没有收到任何例外。

经过一番搜索后,我发现我必须在java的密钥库中导入公共证书,即cacerts(C:\ Program Files \ Java \ jre6 \ lib \ security)。所以我从浏览器导出了https://esb.mkcl.org/的证书,并使用keytool在java中导入,然后执行了控制台应用程序,它就可以了!没有例外。

所以问题是为什么我需要导入微粒 URL的证书(其他HTTPS URL在没有导入任何证书的情况下工作)?

2 个答案:

答案 0 :(得分:3)

该服务器证书(COMODO RSA证书颁发机构)使用的根证书在Java 8 Update 51中是added到Java,因此这意味着您正在使用的Java版本(jre路径中的java6)也是如此已经把它包括在内了。

要默认信任该证书,请更新为never java版本。

顺便说一下,that server的ssl配置非常不安全。

答案 1 :(得分:2)

客户端SSL实现依赖于一组已知的“受信任的根证书”。这些是已知可信/可信赖的SSL证书颁发机构的证书。

“问题”是在Java JDK / JRE中分发的密钥库中的受信任证书集(通常)小于典型Web浏览器中的集合。

这是有原因的。例如:

  • 出于安全原因,“服务器”Java安装可能需要对默认信任的人更加保守......
  • 您可能正在运行较旧的(即维护期外)Java版本。显然,Oracle不会使用新的可信证书刷新密钥库。

某些JRE可以使用主机操作系统默认密钥库或浏览器密钥库。