httpclient3.1跳过ssl验证

2023-09-15 10:58:27

原来的老项目调用一个Http的服务,最近http的服务调整成了https,因此需要调整一下,网上大部分都是4.5以上版本,3.1版本处理方法比较少,因此记录一下

一、实现两个类

1.MyX509TrustManager

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
 
public class MyX509TrustManager implements X509TrustManager {
    /* (non-Javadoc)
    * @see javax.net.ssl.X509TrustManager#checkClientTrusted(java.security.cert.X509Certificate[], java.lang.String)
    */
    public void checkClientTrusted(X509Certificate[] arg0, String arg1)
            throws CertificateException {
 
    }
    /* (non-Javadoc)
     * @see javax.net.ssl.X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String)
     */
    public void checkServerTrusted(X509Certificate[] arg0, String arg1)
            throws CertificateException {
 
    }
    /* (non-Javadoc)
     * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers()
     */
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
}

2.MySecureProtocolSocketFactory

项目使用的jdk版本是1.8,jdk版本默认协议需要指定一下,因此SSLContext context = SSLContext.getInstance("TLSv1.2");

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import org.apache.commons.httpclient.ConnectTimeoutException;
import org.apache.commons.httpclient.HttpClientError;
import org.apache.commons.httpclient.params.HttpConnectionParams;
import org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory;
import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
 
public class MySecureProtocolSocketFactory implements SecureProtocolSocketFactory {
 
    //添加一个属性,主要目的获取ssl跳过验证
    private SSLContext sslContext = null;
    /**
     * Constructor for MySecureProtocolSocketFactory.
     */
    public MySecureProtocolSocketFactory() {
    }
    /**
     * 创建一个获取SSLContext的方法,导入MyX509TrustManager进行初始化
     * @return
     */
    private static SSLContext createEasySSLContext() {
        try {
            SSLContext context = SSLContext.getInstance("TLSv1.2");
            context.init(null, new TrustManager[] { new MyX509TrustManager() },
                    null);
            return context;
        } catch (Exception e) {
            throw new HttpClientError(e.toString());
        }
    }
 
    /**
     * 判断获取SSLContext
     * @return
     */
    private SSLContext getSSLContext() {
        if (this.sslContext == null) {
            this.sslContext = createEasySSLContext();
        }
        return this.sslContext;
    }
    //后面的方法基本上带入相关参数
    /*
     * (non-Javadoc)
     *
     * @see org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket(java.lang.String,
     *      int, java.net.InetAddress, int)
     */
    public Socket createSocket(String host, int port, InetAddress clientHost,int clientPort) throws IOException, UnknownHostException {
        return getSSLContext().getSocketFactory().createSocket(host, port,clientHost, clientPort);
    }
 
    /*
     * (non-Javadoc)
     *
     * @see org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket(java.lang.String,
     *      int, java.net.InetAddress, int,
     *      org.apache.commons.httpclient.params.HttpConnectionParams)
     */
    public Socket createSocket(final String host, final int port,final InetAddress localAddress, final int localPort,
                               final HttpConnectionParams params) throws IOException,UnknownHostException, ConnectTimeoutException {
        if (params == null) {
            throw new IllegalArgumentException("Parameters may not be null");
        }
        int timeout = params.getConnectionTimeout();
        if (timeout == 0) {
            return createSocket(host, port, localAddress, localPort);
        } else {
            return ControllerThreadSocketFactory.createSocket(this, host, port,localAddress, localPort, timeout);
        }
    }
 
    /*
     * (non-Javadoc)
     *
     * @see SecureProtocolSocketFactory#createSocket(java.lang.String,int)
     */
    public Socket createSocket(String host, int port) throws IOException,UnknownHostException {
        return getSSLContext().getSocketFactory().createSocket(host, port);
    }
 
    /*
     * (non-Javadoc)
     *
     * @see SecureProtocolSocketFactory#createSocket(java.net.Socket,java.lang.String,int,boolean)
     */
    public Socket createSocket(Socket socket, String host, int port,boolean autoClose) throws IOException, UnknownHostException {
        return getSSLContext().getSocketFactory().createSocket(socket, host,port, autoClose);
    }
}

最后声明MySecureProtocolSocketFactory加入Protocol就可以了。                                                  

        //声明
        ProtocolSocketFactory fcty = new MySecureProtocolSocketFactory();
        //加入相关的https请求方式
        Protocol.registerProtocol("https", new Protocol("https", fcty, 443));
        //发送请求
        org.apache.commons.httpclient.HttpClient httpclient = new org.apache.commons.httpclient.HttpClient();
        GetMethod httpget = new GetMethod(url);
        System.out.println("======https的服务地址url:" + url);
        try {
            httpclient.executeMethod(httpget);
            return httpget.getResponseBodyAsString();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new Exception(ex.getMessage());
        } finally {
            httpget.releaseConnection();
        }

实现完后自信满满重新打包更新上正式环境,结果报错了。。。
 

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Certificates do not conform to algorithm constraints


	at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)


	at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946)


	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316)


	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:310)


	at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1639)


	at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:223)


	at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037)


	at sun.security.ssl.Handshaker.process_record(Handshaker.java:965)


	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064)


	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)

百度一下这个问题,证书不符合算法约束,基本都是修改配置文件$JAVA_HOME/jre/lib/security/java.security,但是项目是docker部署的,jdk用的是docker里面的,外面服务器里的jdk版本都是11,那每次更新服务都得手动改配置也太麻烦了吧。。。

===================================================================

后面找到一篇文章,修改前面的实现类,把自己实现的类改写成继承新的抽象类:X509ExtendedTrustManager即可,代码如下:

//public class MyX509TrustManager implements X509TrustManager {
public class MyX509TrustManager extends X509ExtendedTrustManager {
//实现方法,所有方法都是空方法
}

再次更新代码,问题解决!

参考:httpclient 3.1跳过https请求SSL的验证_鼓逗猫柠的博客-CSDN博客
https://www.cnblogs.com/flyingeagle/articles/7508207.html

 

更多推荐

Linux 文件权限基础:文件和目录权限管理指南

文章目录Linux文件权限基础1.引言1.1什么是文件权限1.2文件权限的重要性2.Linux文件权限基础2.1Linux文件系统简介2.2文件和目录的属性2.3权限类型:读、写和执行2.4所有者、组和其他用户2.5权限符号表示法:r、w、x和-2.6使用ls-l命令查看文件权限3.修改文件权限3.1使用chmod命令

【JVM】Java的内存模型(JMM)!

一、运行时数据区域划分JVM虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8之前分为:线程共享(Heap堆区、MethodArea方法区)、线程私有(虚拟机栈、本地方法栈、程序计数器)JDK1.8以后分为:线程共享(Heap堆区、MetaSpace元空间)、线程私有(虚拟机栈、本

只需100GB内存,让Falcon 180B在你的电脑上起飞

一、前言自2023年5月,阿布扎比技术创新研究所(TII)发布了两个预训练的LLM:Falcon7B和Falcon-40B,这两个模型的表现十分优异,在OpenLLM排行榜上高居榜首。然而,在短短不到几个月的时间,研究所又推出了第三个重量级的大语言模型——Falcon180B。以下是有关Falcon180B的一些主要特

LLM 11-环境影响

LLM11-环境影响在本章中,首先提出一个问题:大语言模型对环境的影响是什么?这里给出的一个答案是:气候变化一方面,我们都听说过气候变化的严重影响(文章1、文章2):我们已经比工业革命前的水平高出1.2°C需要保持在1.5°C以下以避免气候危机根据目前的轨迹,在未来几十年内将达到2.7°C另一方面,我们看到训练大语言模

不断探索创新 促进中国信息技术发展——南京宏控科技有限公司董事长应富忠

应富忠,男,现任南京宏控科技有限公司董事长、电子系统工程高级工程师(技术五级)、自动化系统注册工程师,先后被评为“研究所级青年突击手”、“研究所级先进工作者”、“研究所级优秀共产党员”、“南京市级考级优秀”等荣誉称号,持有江苏省国防工办系统可靠性设计资质证书。南京市专家组成员,2003-2016年。江苏省科技计划项目评

CESM模型教程

详情点击公众号技术科研吧链接:地球系统模式(CESM)教程前言目前通用地球系统模式(CommunityEarthSystemModel,CESM)在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来,一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆

数据治理-数据仓库环境

数据仓库环境包括一系列组织起来以满足企业需求的架构组件,从源系统流动到数据暂存区,数据可以在这里被清晰,当数据集成并存储在数据仓库或操作数据存储中时,可以对其进行补充丰富。在数据仓库中,可以通过数据集市或数据立方体访问数据,生成各种各样的报表。其中包括:源系统;(CRM\账务系统或者DaaS服务、网页内容和任何大数据计

Spark

ApacheSpark是一种快速、通用、可扩展的大数据处理引擎,旨在处理大规模数据集并进行高效的数据分析。与HadoopMapReduce相比,Spark具有更高的性能和更丰富的功能,可以处理更复杂的数据处理任务。以下是ApacheSpark的一些基本概念:SparkCore:这是Spark的基本引擎,提供了分布式任务

计算机网络的分层体系结构

为什么要分层面对一个复杂系统时,将其划分成小的,功能独立的模块或子系统,能更好的解决问题付诸应用。有哪些好处各层之间是独立的灵活性好结构上可以分开易于实现和维护有利于功能复用能促进标准化工作计算机网络体系结构经历的阶段计算机网络分层体系结构的发展经历了以下主要阶段:早期的分层概念(1970s):分层体系结构的思想最早出

2023.9.11 关于传输层协议 UDP和TCP 详解

目录UDP协议TCP协议TCP十大核心机制确认应答超时重传连接管理(三次握手四次挥手)滑动窗口流量控制拥塞控制延时应答捎带应答面向字节流粘包问题TCP中的异常处理经典面试题对比TCP和UDP如何使用UDP实现可靠传输UDP协议源端口:指发送方的端口号目的端口:指接收方的端口号注意:端口号都是用两个字节来表示的,也就是1

前端开发学习指南

这篇文章很长,但的确是一篇非常干的干货,讲诉了HTML、JavaScript、CSS、jQuery使用的一些规范与建议,前端的同学可以认真阅读此文,并比较自己平时的一些习惯,看是否有改进的地方……HTML咋地了,DOCTYPE?不定义DOCTYPE是一种可以被判死刑的罪行。以前你可能用的是下面的DOCTYPE,不过你要

热文推荐