如何使用RestTemplate访问https实现SSL请求操作
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍了如何使用RestTemplate访问https实现SSL请求操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、添
千家信息网最后更新 2026年11月03日如何使用RestTemplate访问https实现SSL请求操作
这篇文章主要介绍了如何使用RestTemplate访问https实现SSL请求操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
1、添加HttpsClientRequestFactory工具类
import org.springframework.http.client.SimpleClientHttpRequestFactory;import javax.net.ssl.*;import java.io.IOException;import java.net.HttpURLConnection;import java.net.InetAddress;import java.net.Socket;import java.security.cert.X509Certificate; /** * TLS的三个作用: * (1)身份认证 * 通过证书认证来确认对方的身份,防止中间人攻击 * (2)数据私密性 * 使用对称性密钥加密传输的数据,由于密钥只有客户端/服务端有,其他人无法窥探。 * (3)数据完整性 * 使用摘要算法对报文进行计算,收到消息后校验该值防止数据被篡改或丢失。 * * 使用RestTemplate进行HTTPS请求访问: * private static RestTemplate restTemplate = new RestTemplate(new HttpsClientRequestFactory()); * */public class HttpsClientRequestFactory extends SimpleClientHttpRequestFactory { @Override protected void prepareConnection(HttpURLConnection connection, String httpMethod) { try { if (!(connection instanceof HttpsURLConnection)) { throw new RuntimeException("An instance of HttpsURLConnection is expected"); } HttpsURLConnection httpsConnection = (HttpsURLConnection) connection; TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted(X509Certificate[] certs, String authType) { } @Override public void checkServerTrusted(X509Certificate[] certs, String authType) { } } }; SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); httpsConnection.setSSLSocketFactory(new MyCustomSSLSocketFactory(sslContext.getSocketFactory())); httpsConnection.setHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String s, SSLSession sslSession) { return true; } }); super.prepareConnection(httpsConnection, httpMethod); } catch (Exception e) { e.printStackTrace(); } } private static class MyCustomSSLSocketFactory extends SSLSocketFactory { private final SSLSocketFactory delegate; public MyCustomSSLSocketFactory(SSLSocketFactory delegate) { this.delegate = delegate; } // 返回默认启用的密码套件。除非一个列表启用,对SSL连接的握手会使用这些密码套件。 // 这些默认的服务的最低质量要求保密保护和服务器身份验证 @Override public String[] getDefaultCipherSuites() { return delegate.getDefaultCipherSuites(); } // 返回的密码套件可用于SSL连接启用的名字 @Override public String[] getSupportedCipherSuites() { return delegate.getSupportedCipherSuites(); } @Override public Socket createSocket(final Socket socket, final String host, final int port, final boolean autoClose) throws IOException { final Socket underlyingSocket = delegate.createSocket(socket, host, port, autoClose); return overrideProtocol(underlyingSocket); } @Override public Socket createSocket(final String host, final int port) throws IOException { final Socket underlyingSocket = delegate.createSocket(host, port); return overrideProtocol(underlyingSocket); } @Override public Socket createSocket(final String host, final int port, final InetAddress localAddress, final int localPort) throws IOException { final Socket underlyingSocket = delegate.createSocket(host, port, localAddress, localPort); return overrideProtocol(underlyingSocket); } @Override public Socket createSocket(final InetAddress host, final int port) throws IOException { final Socket underlyingSocket = delegate.createSocket(host, port); return overrideProtocol(underlyingSocket); } @Override public Socket createSocket(final InetAddress host, final int port, final InetAddress localAddress, final int localPort) throws IOException { final Socket underlyingSocket = delegate.createSocket(host, port, localAddress, localPort); return overrideProtocol(underlyingSocket); } private Socket overrideProtocol(final Socket socket) { if (!(socket instanceof SSLSocket)) { throw new RuntimeException("An instance of SSLSocket is expected"); } //((SSLSocket) socket).setEnabledProtocols(new String[]{"TLSv1.2"}); ((SSLSocket) socket).setEnabledProtocols(new String[]{"TLSv1", "TLSv1.1", "TLSv1.2"}); return socket; } }}注意:服务端TLS版本要和客户端工具类中定义的一致。(TLSv1.2)
2、修改RestTemplate
在使用的时候,将
private static RestTemplate restTemplate = new RestTemplate();
改为:
private static RestTemplate restTemplate = new RestTemplate(new HttpsClientRequestFactory());
其他代码不变。
也可使用注入的方式:
@Configurationpublic class ConfigBean { @Bean public RestTemplate getRestTemplate() { return new RestTemplate(new HttpsClientRequestFactory()); }}3、访问https,抛出的异常
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure解决方案
因为jdk中jce的安全机制导致报的错,需要去oracle官网下载对应的jce包替换jdk中的jce包。
方案一:替换jce包
目录 %JAVA_HOME%\jre\lib\security里的local_policy.jar,US_export_policy.jarJDK7 http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.htmlJDK8 http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html // pub1:/home/myron/jdk1.7.0_80 % cd $JAVA_HOME/jre/lib/security/ //jce所在jdk的路径US_export_policy.jarlocal_policy.jar
方案二:升级 JDK到1.8版本(推荐方式)
// pub1:/home/myron % vi .cshrcsetenv JAVA_HOME /home/myron/jdk1.8.0_211// pub1:/home/myron % source .cshrc// pub1:/home/myron % java -versionjava version "1.8.0_211"
感谢你能够认真阅读完这篇文章,希望小编分享的"如何使用RestTemplate访问https实现SSL请求操作"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
数据
篇文章
服务
套件
密码
方案
身份
客户
客户端
密钥
工具
方式
版本
认证
最低
一致
对称
三个
中间人
价值
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
重生之互联网科技帝国
互联网与科技金融数据
上海互联网科技有限公司
华宇互联网科技
互联网科技集团
互联网科技生活的内容
西藏七维空间互联网科技有限公司
阿里互联网科技公司
互联网科技有哪些公司
全球顶尖互联网科技公司
福建科技产业互联网发展
崇明区互联网教育科技售后服务
长沙茂晟互联网科技有限公司
明优互联网科技有限公司
科技赋能视角下互联网保险发展
保山互联网科技靠谱吗
北京互联网科技类企业分布
银川新华互联网科技学校原画
杭州融税互联网科技有限公司
互联网领先科技成果宣传视频
深圳市人人互联网科技有限公司
深圳齐家互联网科技
互联网科技公司介绍
佩信高科技互联网
字节跳动和互联网科技
北京华百购互联网科技有限公司
浙江互联网科技研学营
北京市互联网新科技
艺电能源互联网科技有限公司招聘
10位科技互联网大佬