gpt4 book ai didi

java - 无法通过代理建立隧道。代理通过 https 返回 “HTTP/1.1 407”

转载 作者:太空狗 更新时间:2023-10-29 22:48:25 24 4
gpt4 key购买 nike

我遇到了 java6/8 的奇怪行为。我尝试通过需要基本用户身份验证的代理进行隧道传输。通过标准的 java Authenticator 执行此操作。如果我尝试访问 https url 作为第一个 url,则会抛出异常:

java.io.IOException:无法通过代理建立隧道。代理返回“HTTP/1.1 407 需要代理身份验证”

但如果我先访问 http URL,然后再访问 https URL,则 https 访问工作正常。

鉴于该代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;

public class ProxyPass {
public ProxyPass( String proxyHost, int proxyPort, final String userid, final String password, String url ) {

try {
/* Create a HttpURLConnection Object and set the properties */
URL u = new URL( url );
Proxy proxy = new Proxy( Proxy.Type.HTTP, new InetSocketAddress( proxyHost, proxyPort ) );
HttpURLConnection uc = (HttpURLConnection) u.openConnection( proxy );

Authenticator.setDefault( new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
if (getRequestorType().equals( RequestorType.PROXY )) {
return new PasswordAuthentication( userid, password.toCharArray() );
}
return super.getPasswordAuthentication();
}
} );
uc.connect();
/* Print the content of the url to the console. */
showContent( uc );
}
catch (IOException e) {
e.printStackTrace();
}
}

private void showContent( HttpURLConnection uc ) throws IOException {
InputStream i = uc.getInputStream();
char c;
InputStreamReader isr = new InputStreamReader( i );
BufferedReader br = new BufferedReader( isr );
String line;
while ((line = br.readLine()) != null) {
System.out.println( line );
}
}

public static void main( String[] args ) {
String proxyhost = "proxyHost";
int proxyport = proxyPort;
final String proxylogin = proxyUser;
final String proxypass = proxyPass;

String url = "http://www.google.de";
String surl = "https://www.google.de";

// new ProxyPass( proxyhost, proxyport, proxylogin, proxypass, url ); // uncomment this line to see that the https request works!
// System.out.println( url + " ...ok" ); // uncomment this line to see that the https request works!
new ProxyPass( proxyhost, proxyport, proxylogin, proxypass, surl );
System.out.println( surl + " ...ok" );
}

有什么建议、想法吗?

最佳答案

Java 8 更新 111 中的变化:

Now, proxies requiring Basic authentication when setting up a tunnel for HTTPS will no longer succeed by default. If required, this authentication scheme can be reactivated by removing Basic from the jdk.http.auth.tunneling.disabledSchemes networking property, or by setting a system property of the same name to "" ( empty ) on the command line.

http://www.oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html

您的选择:

  • 通过升级代理的身份验证方案来解决问题(为了安全起见),例如摘要访问认证
  • 或者只是通过运行 Java 来解决这个问题

    java -Djdk.http.auth.tunneling.disabledSchemes=""

关于java - 无法通过代理建立隧道。代理通过 https 返回 “HTTP/1.1 407”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41505219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com