Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在wget中调试HTTPS代理失败?_Java_Https_Wget_Http Proxy_Wiremock - Fatal编程技术网

Java 如何在wget中调试HTTPS代理失败?

Java 如何在wget中调试HTTPS代理失败?,java,https,wget,http-proxy,wiremock,Java,Https,Wget,Http Proxy,Wiremock,(这是一个例子,我解决了一个问题,发现了另一个问题) 我通过WireMock代理使用wget获取HTTPS网站。下面是指向演示安全站点的fetch命令: wget -e use_proxy=yes -e https_proxy=localhost:8100 \ https://www.rottentomatoes.com/ 以下是我的代理设置: java -jar wiremock-standalone-2.5.1.jar \ --port 8081 --https-port

(这是一个例子,我解决了一个问题,发现了另一个问题)

我通过WireMock代理使用wget获取HTTPS网站。下面是指向演示安全站点的fetch命令:

wget -e use_proxy=yes -e https_proxy=localhost:8100 \
    https://www.rottentomatoes.com/
以下是我的代理设置:

java -jar wiremock-standalone-2.5.1.jar \
    --port 8081 --https-port 8100 \
    --proxy-all https://www.rottentomatoes.com/ \
    --record-mappings \
    --root-dir ./proxy-cache \
    --verbose
WireMock屏幕日志显示:

2017-03-27 12:08:09.066 Verbose logging enabled
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2017-03-27 12:08:09.827 Verbose logging enabled
2017-03-27 12:08:09.892 Recording mappings to ./proxy-cache/mappings
 /$$      /$$ /$$                     /$$      /$$                     /$$      
| $$  /$ | $$|__/                    | $$$    /$$$                    | $$      
| $$ /$$$| $$ /$$  /$$$$$$   /$$$$$$ | $$$$  /$$$$  /$$$$$$   /$$$$$$$| $$   /$$
| $$/$$ $$ $$| $$ /$$__  $$ /$$__  $$| $$ $$/$$ $$ /$$__  $$ /$$_____/| $$  /$$/
| $$$$_  $$$$| $$| $$  \__/| $$$$$$$$| $$  $$$| $$| $$  \ $$| $$      | $$$$$$/ 
| $$$/ \  $$$| $$| $$      | $$_____/| $$\  $ | $$| $$  | $$| $$      | $$_  $$ 
| $$/   \  $$| $$| $$      |  $$$$$$$| $$ \/  | $$|  $$$$$$/|  $$$$$$$| $$ \  $$
|__/     \__/|__/|__/       \_______/|__/     |__/ \______/  \_______/|__/  \__/

port:                         8081
https-port:                   8100
https-keystore:               jar:file:(removed)/wiremock-standalone-2.5.1.jar!/keystore
proxy-all:                    https://www.rottentomatoes.com/
preserve-host-header:         false
enable-browser-proxying:      false
record-mappings:              true
match-headers:                []
no-request-journal:           false
verbose:                      true
结果是:

--2017-03-27 12:08:25--  https://www.rottentomatoes.com/
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:8100... connected.
Failed reading proxy response: Success
Retrying.

--2017-03-27 12:08:26--  (try: 2)  https://www.rottentomatoes.com/
Connecting to localhost (localhost)|127.0.0.1|:8100... connected.
Failed reading proxy response: Success
Retrying.

^C
如您所见,提取失败,自动重试,需要取消才能结束

我在WireMock命令()中尝试了
--保留主机头
,但结果相同

我想知道代理是否因为需要指向有效的HTTPS证书存储而在内部失败?也就是说,我希望运行的代理会输出一些东西(甚至错误),但它似乎根本没有处理调用。等效的HTTP调用可以正常工作

我能做些什么来了解Wget失败的原因吗?这个错误消息不是很有帮助,据我所知,我无法让它更详细(在wget中,verbose默认是打开的)

这种行为在Alpine 3.4(在Docker容器中)和运行在我的Ubuntu14.04虚拟机上都是一样的。WireMock 2.4.1、2.5.0和2.5.1也一样

试用证书 我尝试将浏览器(Firefox)的HTTPS代理设置切换为指向WireMock,但由于证书不正确,在我尝试获取的网站上失败。有趣的是,WireMock没有向stdout输出任何内容,尽管看起来Firefox已经联系了远程服务器

我想知道Wiremock中的内置密钥库是过时的还是空的,因此学习如何指定“真正的”证书存储可能是下一件值得尝试的事情。我曾经将a转换为JKS格式,这对Wget或Firefox都没有影响

我注意到,我新创建的密钥库是955字节,而原始的PEM证书文件是~260K,因此很明显,并不是所有的证书都已添加(可能只是添加了第一个?)。FWIW我使用了以下命令:

keytool -import -v -trustcacerts -alias endeca-ca \
    -file cacert.pem -keystore truststore.ks
正在联系确认代理 我已经将
-verbose
-verbose:jni
开关添加到
java
调用中,以证明在需要HTTPS代理时发生了一些事情。当我运行Wget命令时,会打印出一篇名副其实的文章,因此我确信HTTPS代理正在被攻击。Wget在HTTP模式下也可以很好地获取数据

如何在一个独立的Jar文件中记录正在发生的事情? 我正处于一个可以盲目尝试各种事情的阶段,我想我需要从Java系统中获得一些智能,看看为什么它首先会失败。我的猜测是Wiremock是问题所在,而不是Wget

我在Wiremock中发现了一个未记录的功能,
——打印所有网络流量
,它提供以下功能:

2017-03-27 17:36:51.287 Opened Socket[addr=/127.0.0.1,port=54140,localport=8100]
2017-03-27 17:36:51.397 Incoming bytes: CONNECT www.rottentomatoes.com:443 HTTP/1.1
User-Agent: Wget/1.15 (linux-gnu)
Host: www.rottentomatoes.com:443


2017-03-27 17:36:51.398 Closed Socket[addr=/127.0.0.1,port=54140,localport=8100]
2017-03-27 17:36:51.399 Closed Socket[addr=/127.0.0.1,port=54140,localport=8100]
2017-03-27 17:36:52.400 Opened Socket[addr=/127.0.0.1,port=54142,localport=8100]
2017-03-27 17:36:52.483 Incoming bytes: CONNECT www.rottentomatoes.com:443 HTTP/1.1
User-Agent: Wget/1.15 (linux-gnu)
Host: www.rottentomatoes.com:443
第二部分重复的次数与wget重试的次数相同,但这里仍然没有什么有用的内容。我想知道为什么它失败了


是否有日志参数可以添加到
java-jar
,或者是否有java的系统范围错误日志可以参考?我已经安装了VisualVM,但是各种输出似乎不太相关。我希望我对异常最感兴趣?

我用PHP编写了自己的代理,根据目标是HTTP还是HTTPS,从代理端看到了
wget
的行为,这暴露了我的误解

基本上,HTTP客户端将使用标准方法(如
GET
POST
)将(纯文本)HTTP请求转发给代理,如果代理愿意,可以捕获这些请求(例如用于播放目的)。这就是WireMock和其他类似工具将要做的

但是,如果HTTP客户端通过代理获取HTTPS目标,则似乎需要使用
CONNECT
方法,然后代理将充当双方之间的流量交换器-它有效地封送加密数据的交换,并且无法对其进行解码

因此,这里可能的解释是WireMock并不费心处理这个动词,因为它无论如何都不能记录数据


让我感到困惑的一个方面是,如果WireMock无法记录通过该端口的数据,为什么它会提供一个
--https端口
。如果我发现答案,我会更新这篇文章。

我正在研究使用WireMock代理HTTPS流量。您是否尝试使用WireMock CLI选项
--https密钥库
指向要解密的证书?我没有,没有@suite22。这是否意味着WireMock成为MITM服务器,然后将新的HTTPS请求转发到预期的端点?因此,它是否使用自签名证书将
CONNECT
转发给自己,然后将请求转发给真正的目标?这是我通过阅读文档所了解的@halfer,但我还没有得到一个完整的端到端示例:)我无法让WireMock正确地提供我所指向的证书。有意义@halfer。在我继续之前,我会再尝试一段时间。是的,汤姆昨天回答了我的一个问题:)