如何调试SSLHandshakeException?

时间:2018-03-05 18:03:48

标签: java ssl sslhandshakeexception

我有一个Java桌面应用程序,通过该应用程序,我可以通过https URL从API成功获取数据。客户端有自己的PKI,在我的应用程序中,他们输入了他们的pki密码和他们的信任库路径以及pki来运行应用程序,并且在代码中设置了系统属性(密钥库,信任库等)以接受这些值。一切都很好。

现在,我正在尝试使用Java Web应用程序中的glassfish通过ssl实现相同的功能,但我得到的是javax.net.ssl.SSLHandshakeException:收到致命警报:unknown_ca(这是当前特定的exc;在调试之前,它是“PKIX路径构建失败...无法找到所请求目标的有效证书路径”)

我研究了如何调试,包括......

1)Java HTTPS client certificate authentication

解决方案:客户端已经有一个pkcs12密钥库,但是通过使用openssl来重新(?)生成pkcs12,然后使用keytool生成信任库来解决故障单。

(我的评论:我的客户已经拥有p12 / pfx格式的证书,以及一个包含可信实体的信任库jks文件,可以直接使用,所以此解决方案似乎不合适)

2)Using browser's certificate in java program

解决方案:将服务器证书添加到truststore

(我的评论:这个指导似乎与下面的指南相反。我假设这些'服务器证书'是针对https api服务器的?我的客户端信任库包含要访问的https api站点的条目。这是有道理的我将它们添加到glassfish信任库,因为glassfish是服务器端;但是,这就是我正在做的事情(即-Djavax.net.ssl.trustStore = glassfish JVM中的clientPathTo / truststore.jks)并在底部获得异常< / p>

3)Unable to find valid certification path to requested target - error even after cert imported

解决方案:将客户端证书添加到-Djavax.net.ssl.trustStore = $ {com.sun.aas.instanceRoot} /config/cacerts.jks

(我的评论:我没试过这个,但是客户端证书的副本是否位于服务器上是否有意义?

令人困惑的一件事是当人们说'服务器'时,我无法判断他们是指'网络服务器'还是'应用服务器'。

无论如何,我在调试模式下运行Glassfish并设置javax.net.debug == ssl。在日志中,我可以看到以下内容:

  • 客户HELLO
  • 服务器HELLO
  • 服务器提供其证书链
  • 服务器发出证书请求
  • glassfish提供证书链
  • glassfish尝试生成会话密钥,数据是 交换,然后它完成数据验证致命警告: 未知的ca,会话无效
  • javax.net.ssl.SSLHandshakeException ...

------ ------ UPDATE

我正在运行glassfish 4.1.1。

这是完整的例外

OUTER

0 个答案:

没有答案