`

【SSL证书校验】Java Client 忽略对服务端的SSL证书校验

阅读更多

背景

在某些特殊的项目中虽然使用了HTTPS,但其证书管理又不是采用常规模式,如服务端用了个自签名的证书。
很多组织的内部项目因为各种原因采用了这种方式。(先不深挖这种模式的利弊)
这种情况下,大多数HTTP客户端工具或框架都默认禁止此类证书。
为了让客户端忽略SSL证书校验,需要额外的客户端代码设置。

 

实现方式

本文针对两种Java常见HTTP客户端请求方式,提供实现样例。

 

HttpClient(org.apache.http.client)

简单直接的方式

SSLContext sslContext = SSLContextBuilder.create()
    .loadTrustMaterial((chain, authType) -> true)
    .build();

HttpClient httpClient = HttpClients.custom()
    .setSSLContext(sslContext)
    .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
    .build();

 

复杂的方式——更多自定义配置

HttpClient只是个Interface,这里可自定义的内容非常多。
如,我们可以通过工具类 HttpClientBuilder 来设置各种细节,最终构建出一个 HttpClient。
此处仅提供一些简单的示例。真实项目中需具体问题具体分析,设置合适的策略。

SSLContext sslContext = new SSLContextBuilder()
    .loadTrustMaterial(null, (chain, authType) -> true)
    .build();

SSLConnectionSocketFactory sslConnectionSocketFactory =
    new SSLConnectionSocketFactory(
        sslContext,
        // 添加你想支持的协议
        new String[]{"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.2"},
        null,
        NoopHostnameVerifier.INSTANCE);
// 或其它重载方法,如:
// new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE)

Registry socketFactoryRegistry =
    RegistryBuilder.create()
        .register("http", PlainConnectionSocketFactory.INSTANCE)
        .register("https", sslConnectionSocketFactory)
        .build();

PoolingHttpClientConnectionManager connectionManager =
    new PoolingHttpClientConnectionManager(socketFactoryRegistry);

HttpClient httpClient = HttpClients.custom()
    .setConnectionManager(connectionManager)
    .build();

 

RestTemplate(org.springframework.web.client)

步骤1:参照前文所述的HttpClient,创建一个HttpClient实例

 

步骤2:创建RestTemplate实例

// httpClient 是步骤1中创建的
HttpComponentsClientHttpRequestFactory requestFactory =
    new HttpComponentsClientHttpRequestFactory(httpClient);

RestTemplate restTemplate = new RestTemplate(requestFactory);

 

分享到:
评论

相关推荐

    kettle中调用restful接口时的SSL信任证书问题

    通过以上方法,用户可以在Kettle中成功信任所有RESTful API服务端的SSL证书,从而顺利地调用这些API。然而,值得注意的是,这些方法可能会降低系统的安全性,因此在实际部署前需要仔细评估其潜在风险。

    Java如何跳过https的ssl证书验证详解

    有两个解决思路:1、确认是单向认证还是双向认证,Server端是否校验Client端;2、可以忽略服务器证书校验(将hostname校验和CA证书校验同时关闭)。网上最常用的,就是利用jdk生成keyStore文件,该方法忽略服务器...

    服务端和客户端,java,C++实现代码

    Java以其跨平台的特性而闻名,它的Socket编程接口使得实现服务端和客户端通信变得相对简单。在Java中,服务端通常创建一个ServerSocket监听特定的端口,等待客户端的连接请求。一旦连接建立,服务器就可以通过Socket...

    java-socket大文件上传-含客户端和服务端

    在Java编程中,Socket是网络通信的基础,常用于实现客户端(Client)与服务器端(Server)之间的双向通信。本项目“java-socket大文件上传-含客户端和服务端”旨在演示如何利用Java Socket API来实现大文件的上传...

    网络文件传输(分服务端和客户端).zip_vb 文件传输_客户端 服务端_文件传输_服务端_网络文件

    "Client.zip"和"Server.zip"可能包含的是使用VB编写的客户端和服务端程序源代码。"www.pudn.com.txt"可能是关于文件来源或教程链接的说明,而"Read Me.txt"通常包含有关压缩包内容的简要介绍或使用指南。 文件传输...

    通讯加密证书 TLS详解.pdf

    - 使用配置文件如 `clientcert.cfg` 来定义证书属性。 **4.1.4 证书格式** - 确保使用的证书格式兼容TLS协议。 **4.1.5 证书校验** - 在部署前,必须确保所有证书均经过正确的校验。 **4.1.6 证书签名配置** -...

    Socket服务端和客户端文件批量传输源码

    在本源码中,服务端(Server)和客户端(Client)分别扮演着不同的角色。服务端通常监听特定的端口,等待客户端的连接请求。一旦客户端连接成功,服务端就可以接收客户端发送的文件数据,并将这些数据保存到本地。...

    xmpp-androidPn server and client

    运行这个服务端需要Java环境支持,并配置好相应的数据库连接和推送设置。 2. androidpn-server-0.5.0-src.zip:这个文件包含了服务器的源代码。开发者可以深入研究代码,理解其工作原理,或者根据需求进行定制和...

    java实现文件传输(上传下载)

    在Java编程语言中,文件传输是一项基础且重要的功能,它涉及到客户端与服务器之间的数据交换。本项目通过"java实现文件传输(上传下载)",旨在教你如何构建一个简单的文件上传和下载系统。以下是对这个项目及其相关...

    STM32客户端连接PC服务端01服务器端向客户端通讯C#服务端源代码_rezip.zip

    STM32-H7 ETH-TCP Client项目是一个基于STM32微控制器的TCP/IP客户端实现,主要涉及了嵌入式系统中的网络通信技术。STM32是意法半导体(STMicroelectronics)推出的一种基于ARM Cortex-M内核的微控制器系列,具有高...

    STM32客户端连接PC服务端01服务器端向客户端通讯C#服务端源代码_rezip1.zip

    STM32-H7 ETH-TCP Client项目是一个基于STM32微控制器的TCP/IP客户端实现,主要涉及了嵌入式系统中的网络通信技术。STM32是意法半导体(STMicroelectronics)推出的一种基于ARM Cortex-M内核的微控制器系列,具有高...

    STM32客户端连接H7. ETH-TCP Client客户端 C语言源代码

    STM32-H7 ETH-TCP Client项目是一个基于STM32微控制器的TCP/IP客户端实现,主要涉及了嵌入式系统中的网络通信技术。STM32是意法半导体(STMicroelectronics)推出的一种基于ARM Cortex-M内核的微控制器系列,具有高...

    iec_104规约_

    在JAVA中实现IEC 104规约,开发者通常会使用socket编程来搭建客户端和服务端的通信桥梁。JAVA的Socket类提供了TCP/IP连接的基础,通过建立连接,双方可以进行双向通信。在实现过程中,关键在于理解并正确解析ASDU和...

    openssl简介-BBS水木清华

    - **`s_client`** 和 **`s_server`**: 分别作为客户端和服务端的测试工具,用于调试SSL连接。 #### 四、OpenSSL的应用场景 - **Web服务器**: 配置HTTPS服务,保护网站数据的安全传输。 - **电子邮件系统**: 使用S...

    华中科技大学计算机学院socket编程实验源代码

    这可能涉及到分块传输、校验和计算以及重传机制,以确保即使在网络不稳定的情况下也能成功传输。 传输消息加密功能是为了保证数据的安全性。可能使用了如SSL/TLS等协议进行加密,确保即便数据在网络中传输,也无法...

    Socket Client

    在本场景中,"Socket Client"的描述表明它被用来实现软件的自动更新,并且能够在后台静默运行,这通常涉及到服务端与客户端之间的交互。 在实现软件自动更新的过程中,Socket客户端扮演着重要的角色。首先,客户端...

    cxf的webservice

    在"安全认证"层面,CXF支持多种安全模型,如SSL/TLS、WS-Security(包括X.509证书、用户名令牌、SAML令牌等)。WS-Security是Web服务的一个重要安全规范,它可以添加诸如签名、加密等安全层到SOAP消息中,以确保数据...

    网络安全协议考试题库.doc

    9. SSL(Secure Sockets Layer)协议提供数据完整性、用户和服务端认证、加密等安全服务,抵御重放攻击、中间人攻击等。SSL工作在TCP/IP层和应用层之间,支持三种验证级别:双向验证、仅服务器验证和匿名验证。 10....

    C/S 聊天工具

    服务端接收到消息后,可以广播给所有已连接的客户端,或者根据需要对消息进行存储或处理。 【客户端实现】 客户端使用TcpClient连接到服务端的IP地址和端口号,建立连接后,同样通过NetworkStream发送和接收数据。...

Global site tag (gtag.js) - Google Analytics