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

如何通过Java中的代理发送HTTPS请求?,第1张

如何通过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”来触发此 *** 作。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5475460.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存