HTTPS代理没有意义,因为出于安全原因,您无法在代理处终止HTTP连接。使用您的信任策略,如果代理服务器具有HTTPS端口,它可能会起作用。您的错误是由使用HTTPS连接到HTTP代理端口引起的。
您可以使用proxy
CONNECT命令使用SSL隧道(很多人称为该代理)通过代理进行连接。但是,Java不支持较新版本的代理隧道。在这种情况下,您需要自己处理隧道。您可以在此处找到示例代码,
http://www.javaworld.com/javaworld/javatips/jw-
javatip111.html
编辑:如果您想击败JSSE中的所有安全措施,您仍然需要自己的TrustManager。像这样
public SSLTunnelSocketFactory(String proxyhost, String proxyport){ tunnelHost = proxyhost; tunnelPort = Integer.parseInt(proxyport); dfactory = (SSLSocketFactory)sslContext.getSocketFactory(); } ... connection.setSSLSocketFactory( new SSLTunnelSocketFactory( proxyHost, proxyPort ) ); connection.setDefaultHostnameVerifier( new HostnameVerifier() { public boolean verify( String arg0, SSLSession arg1 ) { return true; } } );
编辑2:我刚刚尝试了几年前使用SSLTunnelSocketFactory编写的程序,它也不起作用。显然,Sun在Java
5的某个时候引入了一个新的错误。请参阅此错误报告,
http://bugs.sun.com/view_bug.do?bug_id=6614957
好消息是SSL隧道错误已修复,因此您可以使用默认工厂。我只是尝试使用代理,并且一切正常。看我的代码,
public class SSLContextTest { public static void main(String[] args) { System.setProperty("https.proxyHost", "proxy.xxx.com"); System.setProperty("https.proxyPort", "8888"); try { SSLContext sslContext = SSLContext.getInstance("SSL"); // set up a TrustManager that trusts everything sslContext.init(null, new TrustManager[] { new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { System.out.println("getAcceptedIssuers ============="); return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) { System.out.println("checkClientTrusted ============="); } public void checkServerTrusted(X509Certificate[] certs, String authType) { System.out.println("checkServerTrusted ============="); } } }, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory( sslContext.getSocketFactory()); HttpsURLConnection .setDefaultHostnameVerifier(new HostnameVerifier() { public boolean verify(String arg0, SSLSession arg1) { System.out.println("hostnameVerifier ============="); return true; } }); URL url = new URL("https://www.verisign.net"); URLConnection conn = url.openConnection(); BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (Exception e) { e.printStackTrace(); } }}
这是我运行程序时得到的,
checkServerTrusted =============hostnameVerifier =============<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">......
如您所见,SSLContext和hostnameVerifier都被调用。仅当主机名与证书不匹配时,才涉及HostnameVerifier。我使用“
www.verisign.net”来触发此 *** 作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)