我正在努力寻找错误所在,所以我需要一些错误跟踪灵感。
我尝试从在我的 dockerized Payara 4.1 上运行的 Java 网络应用程序调用远程服务器上的网络服务。 Docker 镜像使用带有 Java 8 的 Alpine Linux。
当我尝试调用该服务时,我得到一个
Certificate_unknown 由 SSLHandshakeException 抛出
我知道这意味着信任链不完整并且缺少证书(根/中介)。
当我通过 openssl 检查 ssl 连接时
openssl s_client -connect server:port -CAfile certificate_exported_from_remote_server.per
它工作正常(“验证返回码:0(确定)”。
openssl s_client -connect server:port -CAfile path_to_payara/config/cacerts.jks
不起作用(验证返回码:20(无法获取本地颁发者证书)
),但我还没有发现是否可以将 openssl 与 keystore 一起使用。
无论如何,我已经导入了所有证书(根/中介),我可以从远程 web 服务的服务器下载并通过 keytool 安装它们
keytool -import -v -trustcacerts -alias cert -file downloadedcertificate.cer -keystore payara_path/config/cacerts.jks --storepass pwd -noprompt
当我使用 keytool -list -keystore
列出时,它显示证书已导入。
在 domain.xml
中,jvm-option -Djavax.ssl.trustStore
指向 cacerts.jks。
我认为这是正确的方法,但我仍然遇到这个错误,而且我太盲目了,看不出我做错了什么。
因此,我请求一些灵感来发现错误。
最佳答案
如果需要使用本地生成的证书,需要将其导入到远程服务器。您所做的是将远程证书导入本地信任库,如果 OpenSSL 从信任库中选择了那个确切的证书,这可能会起作用,但我假设本地 ltrust 库中有更多证书,并且它选择了一个不在远程的证书服务器的信任库。
规则很简单:客户端使用的证书必须存在于远程服务器的信任库中
关于java - 发现需要灵感时出错 : certificate_unknown and SSLHandshakeException on Payara,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47663500/