Java6/8の奇妙な振る舞いに直面しています。基本的なユーザー認証が必要なプロキシを介してトンネリングしようとしました。標準のJava Authenticatorでこれを行う。最初のURLとしてhttps URLにアクセスしようとすると、例外がスローされます。
Java.io.IOException:プロキシをトンネリングできません。プロキシが「HTTP/1.1 407 Proxy Authentication Required」を返します
しかし、最初に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" );
}
提案、アイデアはありますか?
変数jdk.http.auth.tunneling.disabledSchemesおよびjdk.http.auth.proxying.disabledSchemesを次のように空白に編集する必要があります。
jdk.http.auth.tunneling.disabledSchemes=
jdk.http.auth.proxying.disabledSchemes=
私の場合、このファイルで見つけました
jdk1.8.0_111/jre/lib/net.properties
変更Java 8アップデート111:
現在、HTTPS用のトンネルを設定するときに基本認証を必要とするプロキシは、デフォルトで成功しなくなりました。必要に応じて、jdk.http.auth.tunneling.disabledSchemesネットワークプロパティからBasicを削除するか、コマンドラインで同じ名前のシステムプロパティを ""(空)に設定することにより、この認証スキームを再アクティブ化できます。
http://www.Oracle.com/technetwork/Java/javase/8u111-relnotes-3124969.html
あなたのオプション:
または単にJavaと実行して問題を回避します
Java -Djdk.http.auth.tunneling.disabledSchemes=""