专栏首页编程java 用httpclient访问https时经常返回403的原因

java 用httpclient访问https时经常返回403的原因

纠结了一天的问题终于落下了帷幕!先听一首歌吧

今天使用了一些httpclient包进行https网页数据的访问,但是一直返回403的问题,一开始以为网站做了限制为了防止爬虫,后来就加入了头部user-Agent来模拟浏览器,结果还是不行。紧接着又加入了cookie,结果仍然返回403。直到下午去github上看到了一个二次封装httpclient的util工具。下载下来放到了idea里访问了一下https的这个url结果成功了。对比了一下不同之处,除了httpclient jar包的版本有高低外还有就是使用的jdk版本不同。于是将相同版本的httpclient jar包放到新建的测试项目下,同样使用jdk1.6 ,结果还是不行。此时就定位到问题的所在了,原来是jdk的版本导致的问题。紧接着在百度搜所了一下原因找到了以下的文章:

问题描述:访问https出现hostname in certificate didn't match问题,本地测试正常原因是本地环境支持了SNI(Server Name Indication),虚拟主机大力发展起来,造成了一个IP会对应多个域名的情况,SNI就是专门用于解决这个问题,它允许客户端在发起SSL握手请求时,就提交请求的Host信息,使得服务器能够切换到正确的域并返回相应的证书。

在java客户端上,SNI要求JDK至少到

,HttpClient至少到4.3.2,本地测试环境满足该要求,而线上环境JDK是1.6的所以会有问题。

解决办法

1,升级运行环境到满足SNI的要求

2,选择忽略hostname校验

可以创建X509HostnameVerifier,重载verify(String hostname, SSLSession session)方法返回true,并设置到httpclient,用于https请求。

新建MyHttpsClient 类

public class MyHttpsClient {

public static MyHttpsClient getInstance(){

return new MyHttpsClient();

}

public CloseableHttpClient createHttpClient() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException{

SSLContextBuilder builder = SSLContexts.custom();

builder.loadTrustMaterial(null, new TrustStrategy() {

@Override

public boolean isTrusted(X509Certificate[] arg0, String arg1)

throws CertificateException {

// TODO Auto-generated method stub

return true;

}

});

SSLContext sslContext = builder.build();

SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(

sslContext, new X509HostnameVerifier() {

@Override

public void verify(String arg0, SSLSocket arg1)

throws IOException {

// TODO Auto-generated method stub

}

@Override

public void verify(String arg0, X509Certificate arg1)

throws SSLException {

// TODO Auto-generated method stub

}

@Override

public void verify(String arg0, String[] arg1, String[] arg2)

throws SSLException {

// TODO Auto-generated method stub

}

@Override

public boolean verify(String hostname, SSLSession session) {

// TODO Auto-generated method stub

return true;

}

});

Registry socketFactoryRegistry = RegistryBuilder

. create().register("https", sslsf)

.build();

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(

socketFactoryRegistry);

CloseableHttpClient httpclient = HttpClients.custom()

.setConnectionManager(cm).build();

return httpclient;

}

}

在HttpUtil中,使用 CloseableHttpClient httpclient = MyHttpsClient.getInstance().createHttpClient();

本文来自企鹅号 - 搞笑视频发不停媒体

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python基础原理:FP-growth算法的构建

    和Apriori算法相比,FP-growth算法只需要对数据库进行两次遍历,从而高效发现频繁项集。对于搜索引擎公司而言,他们需要通过查看互联网上的用词,来找出经...

    企鹅号小编
  • Python基础原理:FP-growth算法的构建

    和Apriori算法相比,FP-growth算法只需要对数据库进行两次遍历,从而高效发现频繁项集。对于搜索引擎公司而言,他们需要通过查看互联网上的用词,来找出经...

    企鹅号小编
  • 新手学习python遇到的一些简单问题

    1.python2 还是python3? 新手经常在这个问题上思考了很久,2和3的语法大致相同,改动不 大,如在python2中print xxx,...

    企鹅号小编
  • 深入浅出Retrofit2.x(二)

    大家在和服务交互的时候,大多情况下都应该使用的是 GET、POST 请求吧,下面我们就对 POST 各种数据类型及如何定义接口进行说明。

    IT大飞说
  • Docker镜像仓库Harbor之Swagger REST API整合配置

    目录 Swagger介绍 预览Harbor REST API Harbor与Swagger 整合配置 FAQ 1、Swagger 介绍 Swagger 是一个...

    哎_小羊
  • 聊聊dubbo spring boot的DubboShutdownMetadata

    本文主要研究一下dubbo spring boot的DubboShutdownMetadata

    codecraft
  • 聊聊dubbo spring boot的DubboShutdownMetadata

    本文主要研究一下dubbo spring boot的DubboShutdownMetadata

    codecraft
  • 程序人生:编程N问

    编程是一门艺术吗 在一定程度上,一切都能感觉到“艺术”,编程也不例外。但在科技行业,人们往往认为“艺术”是随心所欲、难以管理的。如果程序员把编程当成“艺术”,他...

    企鹅号小编
  • Jsoup(一)Jsoup详解(官方)

    一、Jsoup概述 1.1、简介     jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API...

    用户1195962
  • 06 - JavaSE之常用类

    public StringBuffer append(...) 可以为该 StringBuffer 对象添加字符序列,返回添加后的该 StringBuffer ...

    Daotin

扫码关注云+社区

领取腾讯云代金券