httpclient绕过证书验证进行HTTPS请求
2019-04-25 06:54:22来源:博客园 阅读 ()
http请求是我们常用的一种web应用的应用层协议,但是由于它的不安全性,现在正在逐渐向https协议过渡。https协议是在http的基础上进行了隧道加密,加密方式有SSL和TLS两种。当server用https协议进行数据交换后,client请求server时会对server的证书进行校验,如果server端证书为四大证书机构颁发的证书或者其授权机构颁发的证书,则允许进一步请求,否则会警告证书不受信任。更多信息可参考https://www.cnblogs.com/handsomeBoys/p/6556336.html
当用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 @Override 19 public void checkClientTrusted(X509Certificate[] chain, 20 String authType) throws CertificateException { 21 } 22 @Override 23 public void checkServerTrusted(X509Certificate[] chain, 24 String authType) throws CertificateException { 25 } 26 @Override 27 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
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- httpclient 5.0 设置超时时间 2020-05-28
- 如何为SpringBoot服务添加HTTPS证书 2020-03-13
- nginx 反向代理及 https 证书配置 2020-02-02
- Java调用Http接口(4)--HttpClient调用Http接口 2019-11-26
- 基于 TrueLicense 的项目证书验证 2019-11-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash