2016-08-20 115 views
1

我们开发了一个控制台应用程序,它将从HTTPS上的ESB(https://esb.mkcl.org/)中获取数据。当我打到这个网站时,我得到了javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated异常。我将网址更改为https://netbanking.hdfcbank.com/netbanking/,它也位于HTTPS上,打出后我没有收到任何异常。为什么我需要在java中导入服务器证书

经过一番搜索后,我才知道我必须在java的keystore中导入公共证书,例如cacerts(C:\ Program Files \ Java \ jre6 \ lib \ security)。所以我从浏览器导出了https://esb.mkcl.org/的证书,并使用keytool在java中导入了证书,然后执行了控制台应用程序并且它可以正常工作!没有发生异常。

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

回答

3

通过服务器证书(COMODO RSA认证机构)使用的根证书是added到Java中的Java 8更新51,这样就意味着你使用(从你的jre路径的Java6)的Java版本太旧已经包括它。

要使该证书在默认情况下可信,请更新为永不java的版本。

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

+0

我知道为什么我需要将证书导入到java和关于ssl配置我告诉我的IT infra团队,但他们说在glassfish中的所有配置是完美的!我不知道他们是怎么说的。感谢您的证据。如果您对哪个配置不是“完美”有任何想法,请指导。 – Amogh

+0

那么,ssllabs测试页面列出的问题将在那里详细解释。如果您查看第二个信任路径,您会发现它需要额外下载由AddTrust External Root CA交叉签名的上述根证书的[version](http://crt.comodoca.com/COMODORSAAddTrustCA.crt) (应该在信托商店中)。Java不会自动执行下载,因此对于该服务器来说,需要发送该证书,然后它将适用于较老的客户端。 – mata

2

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

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

这是有原因的。例如:

  • 出于安全原因,“服务器”Java安装可能需要更保守默认情况下的信任。
  • 您可能正在运行一个较旧的(即没有维护的)Java版本。显然,Oracle不会用新的可信任证书刷新密钥库。

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

相关问题