WireMock如何代理至要求mTLS的服务器?
WireMock代理mTLS服务器401证书无效问题解决方案
问题概述
此前已实现WireMock记录请求响应,但代理到要求mTLS的服务器时始终返回401,提示证书无效。按官方文档配置信任存储后问题依旧,查询相关内容发现多是被测系统与WireMock间的mTLS配置,而非WireMock出站代理的配置,还看到有Issue提到WireMock代理无法提供证书,疑问是否当前无法实现该需求。
关键配置区分
很多人会混淆WireMock的两类SSL配置:
- 信任存储(truststore):用于让WireMock信任目标服务器的CA证书,确保SSL连接能建立,但这不是mTLS要求的客户端证书认证环节
- 密钥存储(keystore):WireMock作为客户端向目标服务器提供自身的客户端证书,这才是满足mTLS双向认证的核心配置
具体配置步骤
1. 准备客户端密钥库
将你的客户端证书(含私钥)打包为JKS或PKCS12格式的密钥库,示例用keytool生成PKCS12转JKS:
keytool -importkeystore -srckeystore your-client-cert.p12 -srcstoretype PKCS12 -destkeystore wiremock-client-keystore.jks -deststoretype JKS
2. 配置WireMock SSL上下文
Java代码启动方式
WireMockServer wireMockServer = new WireMockServer(options() .httpsPort(8443) // 可选:目标服务器用自签证书时,配置信任存储信任其CA .trustStorePath("path/to/truststore.jks") .trustStorePassword("your-truststore-pass") // 核心:配置WireMock作为客户端的密钥存储,提供给目标服务器认证 .keystorePath("path/to/wiremock-client-keystore.jks") .keystorePassword("your-keystore-pass") // 若密钥与密钥库密码不同,需单独指定 .keyManagerPassword("your-key-pass") ); wireMockServer.start();
命令行启动方式
java -jar wiremock-jre8-standalone.jar \ --https-port 8443 \ --truststore path/to/truststore.jks \ --truststore-password your-truststore-pass \ --keystore path/to/wiremock-client-keystore.jks \ --keystore-password your-keystore-pass \ --key-manager-password your-key-pass
3. 配置代理映射
创建代理映射文件__files/mappings/proxy-mapping.json,确保请求转发到目标服务器:
{ "request": { "method": "ANY", "urlPattern": ".*" }, "response": { "proxyBaseUrl": "https://your-target-mtls-server.com" } }
关于GitHub Issue的说明
你提到的Issue是早期版本WireMock的代理证书支持问题,当前WireMock 3.x及以上版本已完全支持出站代理的mTLS配置,只要正确设置密钥存储和信任存储即可正常工作。
排查建议
- 检查密钥库是否包含完整的客户端证书链(含中间CA),缺失链可能导致服务器认证失败
- 验证密钥库、信任库的密码正确性,密码错误会导致证书无法加载
- 确认目标服务器支持的证书格式(部分服务器可能仅接受PKCS12)
- 启用WireMock调试日志查看SSL握手细节:
java -jar wiremock-jre8-standalone.jar --verbose --debug - 用
openssl直接测试客户端证书有效性,排除证书本身问题:openssl s_client -connect your-target-mtls-server.com:443 -cert your-client-cert.pem -key your-client-key.pem -CAfile server-ca.pem
内容的提问来源于stack exchange,提问作者phillip
相关产品推荐
相关产品推荐

