栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何通过Java中的代理发送HTTPS请求?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何通过Java中的代理发送HTTPS请求?

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”来触发此操作。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/483320.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号