WSO2 Micro Integrator配置密钥库公钥证书未被加载问题
WSO2 Micro Integrator mTLS配置不生效问题排查修复
问题现象
使用Integration Studio 7.2.0的Hello World Docker模板创建MI项目,配置mTLS双向认证时出现以下异常:
- 已在
deployment.toml中编写自定义密钥库、信任库配置:
[keystore.tls] file_name = "interceptor.jks" password = "wso2carbon" alias = "interceptor" key_password = "wso2carbon" [truststore] file_name = "interceptor.jks" password = "wso2carbon" alias = "mg" algorithm="AES"
- 自定义密钥库
interceptor.jks包含两个条目:别名为interceptor的服务端私钥、别名为mg的客户端信任证书 - 不带跳过证书校验参数调用服务时请求失败,调用命令如下:
curl --cacert interceptor.pem --cert mg.pem --key mg.key "https://xml-interceptor:8253/api/v1/handle-request" -H "content-type: application/json" -H "accept: application/json" -d '{"requestBody": "eyJuYW1lIjoiVGhlIFByaXNvbmVyIn0="}' -v
- 添加
-k参数跳过证书校验可请求成功,但客户端收到的服务端证书为WSO2默认localhost证书,证书详情:
* Server certificate: * subject: C=US; ST=CA; L=Mountain View; O=WSO2; OU=WSO2; CN=localhost * start date: Oct 23 07:30:43 2019 GMT * expire date: Jan 25 07:30:43 2022 GMT * issuer: C=US; ST=CA; L=Mountain View; O=WSO2; OU=WSO2; CN=localhost * SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway. > POST /api/v1/handle-request HTTP/1.1
- MI运行日志输出SSL握手告警:
[2022-06-15 13:38:29,417] WARN {SourceHandler} - I/O error: Received fatal alert: unknown_ca
- 尝试将自定义私钥导入默认
wso2carbon.jks后问题仍存在。
排查修复步骤
核心判断:8253端口HTTPS监听器未加载自定义密钥库,仍在使用内置默认证书,问题集中在文件挂载、配置语法、监听器参数、密钥库有效性四个环节,按以下顺序排查:
- 确认密钥库文件挂载路径正确
- Docker模板运行的MI容器,默认从
<MI_HOME>/repository/resources/security/目录读取密钥库文件,仅在deployment.toml写文件名无法让服务找到文件。 - 进容器执行
ls /home/wso2carbon/wso2mi-*/repository/resources/security/,确认interceptor.jks存在且对wso2carbon用户可读。如果是docker-compose部署,检查volume映射规则,必须将本地jks文件映射到容器内上述security目录,不能只挂载conf目录。
- Docker模板运行的MI容器,默认从
- 修正deployment.toml配置语法错误
- 当前信任库配置存在无效字段:
alias不属于truststore的合法配置项,truststore会自动读取库内所有受信任证书条目,无需指定单独别名;JKS信任库默认证书算法为SunX509,错误配置algorithm="AES"会导致配置解析失败。修正后的全局密钥库配置如下:
[keystore.tls] file_name = "interceptor.jks" password = "wso2carbon" alias = "interceptor" key_password = "wso2carbon" [truststore] file_name = "interceptor.jks" password = "wso2carbon"- 修改后必须进容器确认
deployment.toml内容已更新,避免因挂载路径错误导致容器内仍使用旧配置。
- 当前信任库配置存在无效字段:
- 补充HTTPS监听器的mTLS配置
- 仅配置全局keystore和truststore不会自动让8253端口的HTTPS传输层加载自定义证书,也不会开启双向证书校验,必须在deployment.toml中补充传输层配置,该部分配置优先级高于全局密钥库配置:
[transport.http] listener.keystore.file = "interceptor.jks" listener.keystore.password = "wso2carbon" listener.keystore.key_password = "wso2carbon" listener.keystore.alias = "interceptor" listener.truststore.file = "interceptor.jks" listener.truststore.password = "wso2carbon" listener.ssl.verify_client = "require"- 其中
listener.ssl.verify_client = "require"表示强制开启双向认证,要求客户端必须提供信任库内签发的合法证书。
- 验证密钥库本身有效性
- 本地执行keytool命令检查jks内的条目类型是否正确:
keytool -list -v -keystore interceptor.jks -storepass wso2carbon- 确认输出中
interceptor条目类型为PrivateKeyEntry(服务端私钥),mg条目类型为trustedCertEntry(客户端信任证书),不要将两类证书的存储类型搞反。同时检查服务端证书的SAN扩展字段,必须包含调用时使用的域名xml-interceptor,否则证书加载成功后仍会报域名不匹配错误。
- 清理配置冲突
- 还原之前修改的默认
wso2carbon.jks文件,不要同时修改默认密钥库和自定义keystore配置,避免参数冲突。重启容器时删除旧的持久化配置卷,防止旧配置缓存覆盖新参数。
- 还原之前修改的默认
有效性验证
配置修改完成重启容器后,执行以下命令检查服务端返回的证书:
echo | openssl s_client -connect xml-interceptor:8253 2>/dev/null | openssl x509 -noout -subject -issuer
输出的证书主体不再是CN=localhost即为证书加载成功,此时再执行不带-k参数的curl命令即可正常完成mTLS握手,日志中也不会再出现unknown_ca告警。如果仍返回默认证书,直接查看MI启动日志中Loading keystore开头的日志行,确认服务启动时实际加载的密钥库路径,顺着路径排查挂载或配置错误即可。
内容的提问来源于stack exchange,提问作者Amila Senadheera
相关产品推荐
相关产品推荐

