Jetty(9.2.13) HTTP客户端搭配Socks4Proxy请求失败求助
解决Jetty HttpClient连接Burp代理时的SOCKS4 tunnel failed code 84错误
首先得点出核心问题:你把Burp当成SOCKS4代理来用了,但Burp本质是HTTP/HTTPS正向代理,它根本不支持SOCKS4协议,所以才会返回错误码84(SOCKS4里这个码表示请求被拒绝或执行失败)。
下面是具体的修复步骤:
1. 把SOCKS4代理换成HTTP代理配置
直接替换掉代码里的Socks4Proxy部分,改用Jetty的HttpProxy类,适配Burp的代理类型:
SslContextFactory sslContextFactory = new SslContextFactory(); HttpClient httpClient = new HttpClient(sslContextFactory); // 配置Burp的HTTP代理地址和端口(你这里用的是8082) Address proxyAddress = new Address("127.0.0.1", 8082); HttpProxy httpProxy = new HttpProxy(proxyAddress); proxyConfiguration.getProxies().add(httpProxy); httpClient.start(); Request request = httpClient.newRequest(new URI("https://google.com")); request.method(HttpMethod.GET); ContentResponse contentResponse = request.send(); System.out.println(contentResponse.getContentAsString());
2. 检查Burp的代理基础设置
- 确认Burp的「Proxy」->「Options」里的监听地址是
127.0.0.1:8082,和代码里的端口完全一致 - 如果你的Burp设置了代理认证,记得在代码里加上认证信息:
// 替换成你的Burp代理用户名和密码 httpProxy.getAuthentication().addBasicAuthentication("your-proxy-username", "your-proxy-password");
3. 确保SSL证书配置生效
你已经把Burp的cacert.der导入Java信任库了,但有时候Jetty的SslContextFactory可能不会自动加载这个修改后的信任库,可以显式指定来避免SSL证书错误:
SslContextFactory sslContextFactory = new SslContextFactory.Client(); // 替换为你的Java信任库路径,默认路径一般是 $JAVA_HOME/jre/lib/security/cacerts sslContextFactory.setTrustStorePath("/path/to/your/java/cacerts"); // 信任库默认密码是 changeit,如果修改过就换成你的密码 sslContextFactory.setTrustStorePassword("changeit");
补充:错误码84的含义
SOCKS4协议里的错误码84对应的是REQUEST_REJECTED_OR_FAILED,出现这个错误大多是因为代理服务器不支持SOCKS4请求,或者目标地址无法被代理访问——你这里的情况就是前者,用错了代理类型导致的。
内容的提问来源于stack exchange,提问作者Dipankar Dey




