博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
httpclient绕过证书验证进行HTTPS请求
阅读量:5877 次
发布时间:2019-06-19

本文共 2873 字,大约阅读时间需要 9 分钟。

 

 

        http请求是我们常用的一种web应用的应用层协议,但是由于它的不安全性,现在正在逐渐向https协议过渡。https协议是在http的基础上进行了隧道加密,加密方式有SSL和TLS两种。当server用https协议进行数据交换后,client请求server时会对server的证书进行校验,如果server端证书为四大证书机构颁发的证书或者其授权机构颁发的证书,则允许进一步请求,否则会警告证书不受信任。更多信息可参考

        当用httpclient进行请求https,会提示找不到有效的证书(unable to find valid certification path to requested target)

        出现这种情况就是server端的证书不被信任,可以通过重写一个类继承DefaultHttpClient类,代码如下:

1 import org.apache.http.conn.ClientConnectionManager; 2 import org.apache.http.conn.scheme.Scheme; 3 import org.apache.http.conn.scheme.SchemeRegistry; 4 import org.apache.http.conn.ssl.SSLSocketFactory; 5 import org.apache.http.impl.client.DefaultHttpClient; 6  7 import javax.net.ssl.SSLContext; 8 import javax.net.ssl.TrustManager; 9 import javax.net.ssl.X509TrustManager;10 import java.security.cert.CertificateException;11 import java.security.cert.X509Certificate;12 13 public class SSLClient extends DefaultHttpClient {14     public SSLClient() throws Exception{15         super();16         SSLContext ctx = SSLContext.getInstance("TLS");17         X509TrustManager tm = new X509TrustManager() {18             @Override19             public void checkClientTrusted(X509Certificate[] chain,20                                            String authType) throws CertificateException {21             }22             @Override23             public void checkServerTrusted(X509Certificate[] chain,24                                            String authType) throws CertificateException {25             }26             @Override27             public X509Certificate[] getAcceptedIssuers() {28                 return null;29             }30         };31         ctx.init(null, new TrustManager[]{tm}, null);32         SSLSocketFactory ssf = new SSLSocketFactory(ctx,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);33         ClientConnectionManager ccm = this.getConnectionManager();34         SchemeRegistry sr = ccm.getSchemeRegistry();35         sr.register(new Scheme("https", 443, ssf));36     }37 }

        然后在进行https请求创建HttpClient对象时用这个类的构造器创建对象就可以实现https请求,例如:

1 import org.apache.http.Header; 2 import org.apache.http.HttpResponse; 3 import org.apache.http.client.methods.HttpGet; 4 import org.apache.http.impl.client.CloseableHttpClient; 5  6 public class RestApi { 7  8     public static String getCsrf(){ 9         String csrfToken = "";10         try {11             CloseableHttpClient client = new SSLClient();12             String url = "https://10.67.19.186";13             HttpGet get = new HttpGet(url);14             HttpResponse response = client.execute(get);15             Header setCookidHeader = response.getFirstHeader("Set-Cookie");16             csrfToken = setCookidHeader.getValue().split(";")[0].split("=")[1];17         } catch (Exception e) {18             e.printStackTrace();19         }20         return csrfToken;21     }

 

转载于:https://www.cnblogs.com/calvin1102/p/10755421.html

你可能感兴趣的文章
SQL语句的执行过程
查看>>
Silverlight开发历程—动画(线性动画)
查看>>
详解Linux中Load average负载
查看>>
HTTP 协议 Cache-Control 头——性能啊~~~
查看>>
丢包补偿技术概述
查看>>
PHP遍历文件夹及子文件夹所有文件
查看>>
WinForm程序中两份mdf文件问题的解决
查看>>
【转】唯快不破:创业公司如何高效的进行产品研发管理
查看>>
程序计数器、反汇编工具
查看>>
Android N: jack server failed
查看>>
007-Shell test 命令,[],[[]]
查看>>
关于Linux系统使用遇到的问题-1:vi 打开只读(readonly)文件如何退出保存?
查看>>
pandas 按照某一列进行排序
查看>>
在WPF中如何使用RelativeSource绑定
查看>>
Map的深浅拷贝的探究
查看>>
XSLT语法 在.net中使用XSLT转换xml文档示例
查看>>
如何将lotus 通讯簿导入到outlook 2003中
查看>>
WinForm 应用程序中开启新的进程及控制
查看>>
前端工程师的职业发展路线在哪?
查看>>
IOS 内存警告 Memory warning level
查看>>