记Https校验证书问题

SSLSocketFactory 描述

TrustManagers :信任管理组 一般使用 X509证书信任管理器

Protocol: 协议:参考 SSLSocketFactoryBuilder内部参数

SecureRandom:安全随机数,可以根据自定义生成的规则匹配

KeyManager:通过载入证书的方式来实现附带证书请求

TrustManager:信任证书管理器,用于管理证书内容(可以用于避开校验证书问题)

应对SSLHandshakeException

主要是针对Https网站时会校验证书,一般无强制必要,可以进行忽略处理。主要是对X509证书管理器的操作

针对X509证书操作:

针对返回证书的时候,返回为空即可认为忽略处理

X509TrustManager X0509TM = new X509TrustManager() {
   @Override  // 检查客户端证书
   public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {}

   @Override // 检查服务端端证书
   public void checkServerTrusted(X509Certificate[] chain,String authType) throws CertificateException {}

   @Override  //返回受信任的X509证书数组
   public X509Certificate[] getAcceptedIssuers() {
      return null;
   }
};

Hutool-http:

主要是针对HttpRequest的SSLSocketFactory设置

1、SSLSocketFactory构造
//X0509TM 为上述参数
SSLSocketFactory build = SSLSocketFactoryBuilder.create()
               .setTrustManagers(X0509TM) //设置信任证书
               .setProtocol(SSLSocketFactoryBuilder.SSLv3)//设置协议,其实经测试写不写都可以
               .build();
2、设置入hutool工具类内
//url 为自定义请求
String responseText = HttpRequest.post(url)
      .setSSLSocketFactory(build)
      .execute().body();

HttpClient:

整体而言,我们需要如下几步:

1、创建一个 连接池Pool

2、分析为什么https会出现异常

3、分析PoolingHttpClientConnectionManager

1、SSLContent配置(生成SSLFactory)

扩展Socket并提供使用SSL或TLS协议的安全套接字

说白了是 SSLSocketFactory也是产物之一,可以参考其 getDefault()方法

public static SSLContext getSSLContext() {
    SSLContext sslContext = null;
    try {
    	//这里仅仅为了示例,使用了TLSv1.2
        sslContext = SSLContext.getInstance("TLSv1.2");
        // 忽略https校验 主要上述参数 X0509TM
        // 这里可以填入的参数 KeyManager[]、TrustManager[]、SecureRandom
        sslContext.init(null, X0509TM, null);
    } catch (Exception e) {
    	//通常为初始化失败,原因参考
        e.printStackTrace();
    }
    return sslContext;
}
2、主要针对HttpClient的构造(解决方案)

HttpClient协议获取

// 其中 getSSLContext()为上述方法
public static CloseableHttpClient getCloseableHttpsClients() {
    // 采用绕过验证的方式处理https请求
    SSLContext sslcontext = getSSLContext();
    // 设置协议http和https对应的处理socket链接工厂的对象
    Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
        .register("http", PlainConnectionSocketFactory.INSTANCE)
        .register("https", new SSLConnectionSocketFactory(sslcontext)).build();
    PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
    HttpClients.custom().setConnectionManager(connManager);
    // 创建自定义的httpsclient对象
    CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).build();
    return client;
}
3、针对HttpClient连接池的描述
/**
*step1
**/  
进入 PoolingHttpClientConnectionManager.class 
/**
*step2
*可以显而易见发现初始化方法:getDefaultRegistry
*主要由如下方法构成:
**/   
RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.getSocketFactory())
                .register("https", SSLConnectionSocketFactory.getSocketFactory())
                .build();
//step3:
/**
*http并未引发标题问题,我们主要考虑https则,进入SSLConnectionSocketFactory.getSocketFactory()
* 又回到了SSLSocketFactory的这个套接字类
**/  
//虽然有5个实现类,但我就涉及使用的两个,如下:
//1、创建和初始化普通(未加密)套接字的默认工厂类,仅仅简单连接socket,应对http即可
PlainConnectionSocketFactory
//2、附带套接字加密与主机名称校验,我们需要修改的就是这个部分
SSLConnectionSocketFactory

//step4:
/**
*进入SSLConnectionSocketFactory,我们可以通过默认构造类来获取到两个信息
* 1、创建默认的SSLContext --> SSLContexts.createDefault()
*  点进去我们可以发现 sslContext.init这个方法
*  延伸:engineInit 可以基本确定为 SSLContextImpl实现类  
*  我们需要找什么呢,就是要往下挖:unable to find valid certification path to requested target
**/      
    
/**
*step5:
* 排查分析
**/
    

//排除部分1:    
//方法中这部分可以main测试,基本可以排除    
TrustManagerFactory var4 =  TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
var4.init((KeyStore)null);
var2 = var4.getTrustManagers(); 

//剩余部分2:
//由方法中得出,其实也不是在这个部分
this.trustManager = this.chooseTrustManager(var2);

/**
*step6:
* 运行时出错,其实也是的,主要是在工厂类开始建立连接的时候。
* 上面主要是证明不是在配置时出错,同时也说明了配置的地方
**/
SSLSocketFactory 创建连接时 startHandshake() 内部调用访问https连接时,会根据证书进行调用验证。通常会从java环境中根据keytool读取证书,若我们么有配置,则会出现以上异常。通常不是很强要求下,我们直接采取 上述 2中的方法忽略即可,否则继续往获取相关答案:
https://www.cnblogs.com/fron/p/https-20170111.html
    

关于自建证书与证书方面,我找到我看到的一个比较好的文章:https://blog.csdn.net/do_bset_yourself/article/details/78159697 属于都市桃源17年的文章。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值