Java 服务请求 https 接口报错 General SSLEngine problem 问题

问题现象

和客户对接时,我们的应用服务请求客户的接口报错 The connection observed an errorio.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: General SSLEngine problem,但在本地开发环境 Windows 10 系统中直接请求这个 https 接口是正常的。

原因分析

根据服务异常信息,可以大略猜到是 SSL 证书的问题。

查看客户的证书信息,发现证书机构是 CFCA(中国金融认证中心),并不是常见的 GlobalSign、DigiCert、GeoTrust 等证书机构。

在服务器上使用命令 keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts (默认密码为 changeit )查看 JDK 的根证书机构库,没有发现 CFCA 这个机构。

因为根证书机构 CFCA 不被信任,我们的 Java 服务就无法判断此 https 站点证书的合法性了,所以就报错了。

在 Windows 10 系统中打开证书管理工具(通过快捷键 Win + R 打开 运行窗口,再输入 certlm.msc 后回车) ,是可以看到 CFCA 这个机构的根证书的,所以在本地开发环境 Windows 10 系统中直接请求这个 https 接口是正常的。

解决办法

把 CFCA 这个机构的根证书导入 JDK 信任库。

  1. 导出 CFCA 根证书为 cfca.cer 。

  1. 导入 CFCA 根证书到 Java 服务所在服务器的 JDK 根证书库。

    cd $JAVA_HOME/jre/lib/security/

    cp cacerts{,.bak}

    // 要先上传 cfca.cert 到 ${JAVA_HOME}/jre/lib/security/ 目录 // -import:导入证书或者证书链 // -alias:指定在 cacerts 文件中的证书条目别名 // -keystore:指定 JDK 证书库文件 // -file:指定要导入的证书 // 默认密码为 changeit

    keytool -import -alias cfca -keystore J A V A H O M E / j r e / l i b / s e c u r i t y / c a c e r t s − f i l e {JAVA_HOME}/jre/lib/security/cacerts -file JAVAHOME/jre/lib/security/cacerts−file{JAVA_HOME}/jre/lib/security/cfca.cer

    Enter keystore password:

    Owner: CN=CFCA EV ROOT, O=China Financial Certification Authority, C=CN Issuer: CN=CFCA EV ROOT, O=China Financial Certification Authority, C=CN Serial number: 184accd6 Valid from: Wed Aug 08 11:07:01 CST 2012 until: Mon Dec 31 11:07:01 CST 2029 Certificate fingerprints: MD5: 74:E1:B6:ED:26:7A:7A:44:30:33:94:AB:7B:27:81:30 SHA1: E2:B8:29:4B:55:84:AB:6B:58:C2:90:46:6C:AC:3F:B8:39:8F:84:83 SHA256: 5C:C3:D7:8E:4E:1D:5E:45:54:7A:04:E6:87:3E:64:F9:0C:F9:53:6D:1C:CC:2E:F8:00:F3:55:C4:C5:FD:70:FD Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 4096-bit RSA key Version: 3

    Extensions:

    #1: ObjectId: 2.5.29.35 Criticality=false AuthorityKeyIdentifier KeyIdentifier \[ 0000: E3 FE 2D FD 28 D0 0B B5 BA B6 A2 C4 BF 06 AA 05 ..-.(........... 0010: 8C 93 FB 2F .../ ]

    #2: ObjectId: 2.5.29.19 Criticality=true BasicConstraints: CA:true PathLen:2147483647

    #3: ObjectId: 2.5.29.15 Criticality=true KeyUsage Key_CertSign Crl_Sign

    #4: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier KeyIdentifier \[ 0000: E3 FE 2D FD 28 D0 0B B5 BA B6 A2 C4 BF 06 AA 05 ..-.(........... 0010: 8C 93 FB 2F .../ ]

    Trust this certificate? no: yes Certificate was added to keystore

    // 查看导入的证书

    keytool -list -keystore ${JAVA_HOME}/jre/lib/security/cacerts -alias cfca

    Enter keystore password:

    cfca, Jan 29, 2021, trustedCertEntry, Certificate fingerprint (SHA1): E2:B8:29:4B:55:84:AB:6B:58:C2:90:46:6C:AC:3F:B8:39:8F:84:83

    keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts | grep CFCA

    Enter keystore password: changeit Owner: CN=CFCA EV ROOT, O=China Financial Certification Authority, C=CN Issuer: CN=CFCA EV ROOT, O=China Financial Certification Authority, C=CN

  2. 重启 Java 服务。

相关推荐
小蒜学长13 分钟前
校园社团招新网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·校园社团招新网站
蜗牛互联网2 小时前
从Barclays扩大Claude部署看受监管软件工程的责任重分配
java·大数据·人工智能·后端·软件工程
周杰伦fans3 小时前
C#对话摘要降低Token消耗
人工智能·后端·c#
做系统的大强3 小时前
脚本说 PASS、OS 读全零 —— 到底是谁在撒谎?
后端·操作系统
code2cat4 小时前
【随笔】MCP资源更新订阅:通知到达以后,Agent怎样刷新旧资料
java·后端·开发工具·ai agent·mcp
Harvil_5 小时前
任务跑一半,API 突然报“对话超长“断流:我给 Agent 修的紧急逃生通道
后端
用户EasyAdminBlazor5 小时前
EasyAdminBlazor SignalR 实时消息源码解析:从 NotificationHub 到站内消息
后端
程序猿乐锅5 小时前
【黑马点评 | 第十一篇】关注 Feed 流实现
java·数据库·redis·分布式·后端·缓存·maven
用户EasyAdminBlazor5 小时前
EasyAdminBlazor 定时任务:FreeScheduler 可视化调度与任务管理
后端
Cosolar6 小时前
云端部署阿里 Qwen-Image-2.1 保姆级教程
人工智能·后端·github