java - 如何在 WireMock 中成功代理 HTTPS 端点?

标签 java https http-proxy wiremock

我正在编写一个内部使用 WireMock 的 HTTP 记录播放代理,并且在记录 HTTPS 目标时遇到问题。 HTTP 站点工作正常。

以下是我为未加密站点设置 WireMock 代理的方法:

java \
    -jar /var/proximate/wiremock-standalone-2.4.1.jar \
    --port 9000 \
    --proxy-all http://ilovephp.jondh.me.uk \
    --record-mappings \
    --root-dir /remote/experiment/record/http

然后我可以使用此命令记录该网站上的任何内容:

wget -e use_proxy=yes -e http_proxy=proximate-proxy:9000 \
    http://ilovephp.jondh.me.uk/en/tutorial/make-your-own-blog

很快我就会得到一些自动创建的映射:

/ # ls -R /remote/experiment/record/http
/remote/experiment/record/http:
__files   mappings

/remote/experiment/record/http/__files:
body-tutorial-make-your-own-blog-tWrNm.txt

/remote/experiment/record/http/mappings:
mapping-tutorial-make-your-own-blog-tWrNm.json

这里的内容大致相同,但在 SSL 站点上。首先代理:

java \
    -jar /var/proximate/wiremock-standalone-2.4.1.jar \
    --port 9000 \
    --proxy-all https://www.rottentomatoes.com/ \
    --record-mappings \
    --root-dir /remote/experiment/record/https \
    --verbose

这是获取:

wget -e use_proxy=yes -e http_proxy=proximate-proxy:9000 \
    https://www.rottentomatoes.com/

WireMock 的结果是创建了内部缓存目录,但它们不包含任何内容:

/ # ls -R /remote/experiment/record/https
/remote/experiment/record/https:
__files   mappings

/remote/experiment/record/https/__files:

/remote/experiment/record/https/mappings:

我在 Docker 容器中的 Alpine 3.4 上使用 WM 2.4.1。我是否需要使用一些特定于 https 的命令行开关才能使其正常工作?

更新

看到最近发布的版本,我暂时感到振奋 2.5.0最近合并了 https-bind-address-bug,这听起来非常相关。我尝试过这个版本,但不幸的是它没有什么区别。

最佳答案

这已部分解决 - 我的主要错误是 HTTPS 连接的代理地址是为 WireMock 和客户端单独设置的。我现在使用的是:

java \
    -jar /var/proximate/wiremock-standalone-2.4.1.jar \
    --port 9000 \
    --https-port 9050 \
    --proxy-all https://www.rottentomatoes.com/ \
    --record-mappings \
    --root-dir /remote/experiment/record/https \
    --verbose \
    --print-all-network-traffic

我添加了 --print-all-network-traffic,以便我可以查看是否有任何 HTTPS 流量到达代理(现在是)。

这是新的客户端命令,包含新的代理指令:

wget -e use_proxy=yes -e http_proxy=proximate-proxy:9000 \
     -e https_proxy=proximate-proxy:9050 \
     --verbose \
     --user-agent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0" \
     https://www.rottentomatoes.com/

但是,现在代理实际上正在使用,看起来操作没有成功完成。我尝试过其他加密网站并收到相同的模糊错误:

Resolving proximate-proxy... 172.18.0.2
Connecting to proximate-proxy|172.18.0.2|:9050... connected.
Failed reading proxy response: No error information
Retrying.

--2017-01-26 09:20:18--  (try: 2)  https://www.rottentomatoes.com/
Connecting to proximate-proxy|172.18.0.2|:9050... connected.
Failed reading proxy response: No error information
Retrying.

--2017-01-26 09:20:20--  (try: 3)  https://www.rottentomatoes.com/
Connecting to proximate-proxy|172.18.0.2|:9050... connected.
Failed reading proxy response: No error information
Retrying.

^C

我已经更换了用户代理,以防基于标准“wget”字符串的第三方拒绝,但这似乎也没有影响。

我将就此提出一个新问题,以缩小这是 WireMock 还是 Wget 问题。

关于java - 如何在 WireMock 中成功代理 HTTPS 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41837847/

相关文章:

java - Ehcache web CacheManager.replaceCacheWithDecoratedCache 抛出 NPE

java - 我如何使用 DynamoDB 的 IN 条件

c - 使用 Joshua Davies 的书 "Implementing SSL/TLS Using Cryptography and PKI"实现 TLS 服务器/客户端

java - 在 jar 中找不到 KeyStore 文件,尽管存在于 jar 中

apache - 反向代理: unwanted URL change

node.js - NPM install --global 命令代理问题

java - 通过按给定百分比增加来传递和更新分数数组

Java 泛型推断类型

.htaccess - 仅一页的 HTTPS

c# - 通过http代理发送邮件