仅服务器端出现javax.net.ssl.SSLHandshakeException握手失败问题求助
解决PL/SQL调用Java发起HTTPS请求时的SSLHandshakeException问题
我之前也踩过几乎一模一样的坑!你本地能解决是因为把证书加到了自己用的JRE信任库,但PL/SQL里的Java代码是跑在Oracle数据库自带的JVM里的,它的信任库和你本地/服务器上独立的JDK完全不是一回事,这就是问题的核心。下面是一步步的解决办法:
第一步:定位Oracle数据库使用的JVM信任库路径
Oracle自带的JRE通常在安装目录下,你可以通过PL/SQL查询确认:
SELECT value FROM v$parameter WHERE name = 'java_home';
返回的路径一般类似 /u01/app/oracle/product/19c/dbhome_1/jre,对应的信任库文件是 lib/security/cacerts。
第二步:导出子域名的SSL证书
用openssl命令从目标子域名导出证书(服务器上要装openssl,没装的话先安装):
openssl s_client -connect subdomain.example.com:443 < /dev/null | openssl x509 -outform PEM > subdomain.crt
这条命令会把subdomain.example.com的证书保存成PEM格式的subdomain.crt文件。
第三步:将证书导入Oracle的信任库
用Oracle自带的keytool工具导入证书,注意必须用Oracle数据库的运行用户(比如oracle用户)执行,避免权限问题:
$ORACLE_HOME/jre/bin/keytool -import -alias subdomain_example -keystore $ORACLE_HOME/jre/lib/security/cacerts -file subdomain.crt
- 这里的
alias可以随便取,只要唯一就行,比如subdomain_example - 默认的信任库密码是
changeit(大部分Oracle版本都是这个,如果你改过就用自己的密码) - 执行时会提示是否信任该证书,输入
yes确认即可
第四步:验证证书是否导入成功
用下面的命令检查刚才的证书是否已经在信任库里:
$ORACLE_HOME/jre/bin/keytool -list -keystore $ORACLE_HOME/jre/lib/security/cacerts -alias subdomain_example
如果能看到证书的详细信息,说明导入成功。
额外排查点(如果导入后还是报错)
- 检查你的PL/SQL Java代码是否硬编码了信任库路径:如果代码里指定了自定义的keystore,得改成Oracle的
cacerts路径,或者去掉硬编码让它用默认信任库。 - 集群环境要同步操作:如果是RAC集群,所有节点都要导入证书,不然只有单个节点能正常访问。
- 重启数据库实例:极少数情况下,Oracle JVM需要重启才能加载新证书,导入后如果还是失败,可以试试重启数据库。
注意事项
- 不要直接替换
cacerts文件:直接覆盖会丢失原有信任的根证书,一定要用keytool导入的方式。 - 不同Oracle版本的JRE路径可能有差异:比如12c及以后有些版本的JRE在
$ORACLE_HOME/jdk/jre下,执行命令时要对应调整路径。
内容的提问来源于stack exchange,提问作者Iván
相关产品推荐
相关产品推荐

