
本文详解如何在 wiremock 中正确配置 https 服务(如 https://apigeew-uat.company.net),明确端口默认规则、configurefor 的作用,并提供安全启动与主机名匹配的完整实践方案。
本文详解如何在 wiremock 中正确配置 https 服务(如 https://apigeew-uat.company.net),明确端口默认规则、configurefor 的作用,并提供安全启动与主机名匹配的完整实践方案。
WireMock 默认监听 HTTP(端口 80)或 HTTPS(端口 443)——当目标 URL 如 https://apigeew-uat.company.net/path/link 未显式指定端口时,客户端会自动使用 HTTPS 默认端口 443。因此,要使 WireMock 响应该域名的请求,必须将其 HTTPS 端口显式设为 443,而非仅传入 new WireMockServer(443)(该构造函数仅设置 HTTP 端口,易被误解):
import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.core.WireMockConfiguration;
WireMockServer wireMockServer = new WireMockServer(
WireMockConfiguration.options()
.httpsPort(443) // ✅ 关键:启用 HTTPS 并绑定至 443
.httpPort(0) // 可选:禁用 HTTP(设为 0 表示随机空闲端口)
);
wireMockServer.start();
⚠️ 注意:configureFor("localhost", 443) 仅用于配置 Java 客户端 SDK 的连接地址(即后续调用 stubFor() 时向哪个地址发送管理请求),并不影响 WireMock 实际监听的协议或端口。它等价于设置 WireMock.configureFor("localhost", 443),本质是为 WireMock 静态工具类指定管理端点,与服务监听无关。
要让 WireMock 正确识别并响应 https://apigeew-uat.company.net 的请求,还需两点关键配置:
-
启用主机头匹配(Host Header Matching)
默认情况下,WireMock 不校验 Host 请求头。需通过 host() 匹配器显式约束:stubFor(post(urlEqualTo("/path/link")) .withHeader("Host", equalTo("apigeew-uat.company.net")) // ✅ 强制匹配 Host 头 .willReturn(aResponse() .withBody("hello world") .withStatus(200) ) ); -
解决 TLS 证书信任问题
WireMock 内置自签名证书,浏览器或严格 TLS 客户端会拒绝连接。解决方案二选一:- 开发阶段:将 WireMock 的证书(启动日志中输出的 keystore.jks 路径)导入客户端信任库;
-
生产模拟:通过 .trustStorePath() 和 .trustStorePassword() 加载自有受信证书:
.httpsPort(443) .keystorePath("/path/to/keystore.jks") .keystorePassword("password") .keyManagerPassword("password")
? 权限提醒:Linux/macOS 下绑定端口 443 需 sudo 权限(普通用户无法绑定 1024 以下端口):
sudo java -jar your-app.jar
✅ 最终验证方式:使用 curl -k https://apigeew-uat.company.net:443/path/link(-k 忽略证书校验)或配置 /etc/hosts 将域名解析至 127.0.0.1 后直接访问 https://apigeew-uat.company.net/path/link(需已导入证书)。
总结:WireMock 基于主机名的 HTTPS 模拟 = 正确设置 httpsPort(443) + Host 请求头匹配 + TLS 证书可信配置。忽略任一环节均会导致连接失败或 404 响应。











