WSO2 API Manager无法连接带密码自定义证书的HTTPS后端API
我之前碰到好几个开发者遇到过一模一样的问题——Postman能正常调用带密码自定义证书的HTTPS API,但WSO2 APIM测试时就抛出javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated错误。核心原因很简单:WSO2的Java运行时信任库没有信任你后端服务器的自定义证书,Postman之所以能成功,是因为它自动或手动信任了这个证书,但WSO2默认只信任官方CA签发的证书,你的自签名/自定义证书不在它的信任列表里。
咱们一步步来解决:
1. 导出后端服务器的自定义证书
首先得把后端API服务器的证书导出来,有两种方式:
- 用keytool命令导出(如果知道后端证书的密钥库信息):
假设后端证书存放在keystore.jks里,密钥库密码是your-keystore-pass,证书别名是backend-cert-alias,执行命令:keytool -export -alias backend-cert-alias -keystore keystore.jks -file backend-cert.cer -storepass your-keystore-pass - 用浏览器导出:
直接访问你的后端API地址https://localhost:8443,点击地址栏的锁形图标,找到证书详情,选择导出证书(保存为.cer格式即可)。
2. 将证书导入WSO2的信任库
WSO2默认使用的信任库是<APIM安装目录>/repository/resources/security/wso2carbon.jks,默认密码是wso2carbon。把刚才导出的证书导入这个信任库:
keytool -import -alias backend-api-cert -file backend-cert.cer -keystore <APIM_HOME>/repository/resources/security/wso2carbon.jks -storepass wso2carbon
执行命令后,会提示你是否信任这个证书,输入yes确认即可。
3. 确认WSO2的SSL客户端配置(可选但建议检查)
打开<APIM_HOME>/repository/conf/axis2/axis2.xml,找到HTTPS传输发送器的配置块(<transportSender name="https" class="org.apache.synapse.transport.passthru.PassThroughHttpSSLSender">),确保信任库的参数配置正确:
<parameter name="TrustStore" locked="false">repository/resources/security/wso2carbon.jks</parameter> <parameter name="TrustStorePassword" locked="false">wso2carbon</parameter>
如果你用了自定义的信任库(不是默认的wso2carbon.jks),这里要替换成对应的路径和密码。
4. 重启WSO2 API Manager
所有配置修改后,必须重启WSO2服务器才能让新的信任库配置生效。
额外排查点(如果还是报错)
- 检查证书的域名匹配:后端证书的CN(通用名称)必须和你在WSO2里配置的后端地址域名一致(比如都是
localhost),否则会触发SSL域名不匹配错误; - 检查证书是否过期:用keytool或浏览器查看证书的有效期;
- 如果是双向SSL场景(后端要求客户端也提供证书),还要把WSO2的客户端证书导入到后端服务器的信任库,同时在axis2.xml里配置客户端密钥库的参数(
KeyStore和KeyStorePassword)。
内容的提问来源于stack exchange,提问作者Mahesh Siva S T

