Spring实现HTTPS方式访问服务(单向认证)

这篇具有很好参考价值的文章主要介绍了Spring实现HTTPS方式访问服务(单向认证)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、基本概念

二、创建keyStore、trustStore

三、服务端配置

四、客户端配置

总结

参考链接


前言

本文通过Spring来配置https服务,后续会将相关的知识内容简单讲解一下,该文章主要是https单向认证,双向认证实现过程将在后续不久的另外一边文章涉及,感兴趣的小伙伴可以提前提供关注一下。

在我们搭建的web服务中,如果没有去配置过https相关的配置,那么该服务只是一个普通的http服务,如果想要该服务成为一个https服务,通过https的方式访问接口的话,那么首先需要的是生成证书,公钥,私钥等相关内容,再进行https配置了,在开始实现之前,我们需要简单了解一下什么是HTTP,HTTPS,SSL/TLS,数字证书,公钥/私钥,keyStore, trustStore等简单的概念。


一、基本概念

友情提示:以下概述均摘自百度百科加其他文章参考,参考链接将放到最下面。

1、HTTP:

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。

2、HTTPS:

HTTPS (全称:Hypertext Transfer Protocol Secure ),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间),HTTP默认端口是80,HTTPS默认端口是443。

HTTPS相对HTTP提供了更安全的数据传输保障,主要体现在三个方面:

1)内容加密:客户端到服务器的内容都是以加密形式传输,中间者无法直接查看明文内容;

2)身份认证:通过校验保证客户端访问的是自己的服务器;

3)数据完整性:防止内容被第三方冒充或者篡改。

3、SSL/TLS:

TLS是传输层加密协议,前身是SSL协议。由网景公司于1995年发布。后改名为TLS。常用的 TLS 协议版本有:TLS1.2, TLS1.1, TLS1.0 和 SSL3.0。其中 SSL3.0 由于 POODLE 攻击已经被证明不安全。TLS1.0 也存在部分安全漏洞,比如 RC4 和 BEAST 攻击。

4、数字证书:

数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,在网上用它来识别对方的身份。因此数字证书又称为数字标识。数字证书对网络用户在计算机网络交流中的信息和数据等以加密或解密的形式保证了信息和数据的完整性和安全性。在建立HTTPS链接过程中,需要传递数字证书对服务进行认证。

5、公钥/私钥:

公钥是与私钥算法一起使用的密钥对的非秘密一半。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。公钥和私钥是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),其中的一个向外界公开,称为公钥;另个自己保留,称为私钥。通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功 。

6、keyStore:

keyStore是一个可以存储密钥、密钥对或证书的存储库。

  • 密钥:只有一个钥,一般是对称加密时使用
  • 密钥对:包含公钥和私钥,一般是非对称加密时使用
  • 证书,即数字证书,用于网络上进行身份验证

keyStore文件的类型可以是JSK、PKCS12、JCEKS

  • JKS(Java Key Store)可以存储密钥对和证书
  • PKCS12、JCEKS都可以存储密钥、密钥对、证书

在创建keyStore文件时,可以为keyStore设置密码

密钥、密钥对、证书在keyStore统称为key,每一个key通过alias(别名)区分。key也可以设置密码(具体体现在keytool创建keyStore和trustStore时),keyStore可以存储多对key

通过keytool成功往一个keyStore文件添加密钥对后,可以从该keyStore中获取到私钥、证书以及公钥(公钥主要以证书的形式存放)。

7、trustStore:

trustStore中保存的是一些可信任的证书

trustStore文件的类型可以是JSK、PKCS12、JCEKS

二、创建keyStore、trustStore

1、创建keyStore

keytool -genkey -alias serverKey -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore serverKeystore.p12 -storepass 123456 -ext san=ip:127.0.0.1,dns:localhost

在控制台执行该命令,用需要输入一些基本信息,按要求输入即可,从keyStore中可以获取到证书、公钥、私钥

2、创建trustStore

 1)从keyStore中导出证书

keytool -exportcert -keystore serverKeystore.p12 -alias serverKey -storepass 123456 -rfc -file server-certificate.pem

2)将证书添加到trustStore中

keytool -import -trustcacerts -file server-certificate.pem -keypass 123456 -storepass 123456 -keystore clientTruststore.jks

3、生成结果

执行完上述指令后,在目录下生成的文件如下:

spring https,后端开发问题解决集合,java,spring,spring boot,https

上图中我们只需要关注serverKeystore(keyStore)和clientTruststore(trustStore)

  • serverKeystore用于在服务端进行配置,serverKeystore提供证书、私钥、公钥
  • clientTruststore用于在客户端进行配置,当该客户端收到服务端的证书时,将会从clientTruststore中与服务端的证书进行比对

三、服务端配置

首先是将服务端搭建成以https方式访问的web服务,这里我们默认服务就是一个spring boot服务了,有关spring boot服务怎么搭建,不是本文重点,本文着重于https相关配置

1、将证书serverKeystore.p12存放到resource目录下

spring https,后端开发问题解决集合,java,spring,spring boot,https

2、application.yml配置如下

server:
  port: 8000
  ssl:
    key-store: classpath:serverkeystore.p12
    key-store-type: PKCS12
    key-store-password: 123456
    key-alias: serverKey

key-store:用于指定你的keyStrore文件

key-store-type:指定你的文件的类型,在上面说过,keyStore的类型可以是JKS、PKCS12、JCEKS

key-store-password:就是你在通过keytool创建keyStore时指定的密码

key-alias: 指定使用哪一个key

3、启动服务进行验证

随便写个接口进行调用,这里就不展示代码出来了

以http方式访问结果如下:

spring https,后端开发问题解决集合,java,spring,spring boot,https

如图,提示我们需要通过https的方式去访问该接口

以https方式访问结果如下:

spring https,后端开发问题解决集合,java,spring,spring boot,https

 可以看到,浏览器提示不安全,那是因为颁发证书的机构是我们自己,是浏览器不认可的,正常情况下证书的颁发是由合法的CA机构来做的

至此,服务端https搭建完成,接来下就是展示客户端调用https接口的解决方案了,感兴趣的小伙伴可以接着往下看

四、客户端配置

对于客户端来说,调用https接口时,会接收到服务端传送过来的证书,我们有两种解决方案一是校验证书的合法性,二是忽略对证书的校验,以下将通过案例进行展示

在没有进行有关https的配置时,直接调用服务端接口,你会看到控制台报一下错误:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

这是因为我们在接收到服务端的证书之后,却没有进行任何处理,导致报错,以下将提供两种解决方案步骤

1、方案一:校验证书合法性

1)将clientTruststore存放到客户端服务的resource目录下

spring https,后端开发问题解决集合,java,spring,spring boot,https

2)引入以下依赖

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.6</version>
</dependency>

3) application.yml的配置如下

server:
  port: 9000

这里有一点需要提示,在配置文件中,server.ssl.trust-store可以对trustStore进行配置,但客户端在这里配置是没有用的,因为该配置是用于双向认证中服务端进行配置的,服务端在此处配置trustStore,可以用于校验客户端的证书。如果你的客户端同时也作为服务端向外提供服务,也需要校验其他服务的证书的话,那么,此时你就需要配置server.ssl.trust-store了

而客户端作为发起请求方,对于证书的校验,应该在发起请求的工具上进行完成,在本文中使用的是RestTemplate,接下来将对RestTemplate进行配置

4)RestTemplate配置

@Configuration
@Slf4j
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory httpComponentsClientHttpRequestFactory) {
        RestTemplate restTemplate = new RestTemplate(httpComponentsClientHttpRequestFactory);
        restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
        return restTemplate;
    }

    @Bean("httpComponentsClientHttpRequestFactory")
    public ClientHttpRequestFactory httpComponentsClientHttpRequestFactory() throws IOException, UnrecoverableKeyException, CertificateException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        final String allPassword = "123456";
        TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
        SSLContext sslContext = SSLContextBuilder
                .create()
                .loadTrustMaterial(new ClassPathResource("clientTruststore.jks").getURL(), allPassword.toCharArray())
                .loadTrustMaterial(null, acceptingTrustStrategy)
                .build();
        HttpClient client = HttpClients.custom()
                .setSSLContext(sslContext)
                .build();
        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(client);
        // INSTANCE 忽略域名检查,不建议忽略检查,校验到证书所关联域名和请求域名不一致时,就会忽略,让连接建立成功
        /*SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
        CloseableHttpClient httpclient = HttpClients
                .custom()
                .setSSLSocketFactory(sslConnectionSocketFactory)
                .setSSLHostnameVerifier(new NoopHostnameVerifier())
                .build();
        requestFactory.setHttpClient(httpclient);*/
        return requestFactory;
    }
}

5)通过该RestTemplate实例去调用服务端接口,就可以发现能够正常调用

2、方案二:直接忽略证书校验

忽略对证书的校验,可以看我这一篇博客,通过文章中的配置,就可以忽略对服务端证书的校验,直接相信它就是服务端

RestTemplate发送请求,配置HTTPS请求忽略SSL证书_明天再去学习的博客-CSDN博客_resttemplate 忽略ssl


总结

通过本文章简单描述了https服务搭建以及单向认证的实现的过程,接下来将会出一篇博客,实现https双向认证,双向认证与单向认证之间存在着紧密联系,清楚了单向认证实现流程,那么,双向认证也不在话下了。

参考链接

https://zhuanlan.zhihu.com/p/36527074

KeyStore是什么_markix的博客-CSDN博客_keystore

[SpringBoot]实战配置Https证书和RestTemplate配置Https双向认证 - 简书文章来源地址https://www.toymoban.com/news/detail-592984.html

到了这里,关于Spring实现HTTPS方式访问服务(单向认证)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PPP 认证 配置CHAP单向认证示例(本地认证方式)实验

    组网需求 如图1所示,RouterA的Serial1/0/0和RouterB的Serial1/0/0相连。 用户希望RouterA对RouterB进行可靠的认证,而RouterB不需要对RouterA进行认证。 图1  CHAP认证组网图   配置思路 配置思路如下: 用户希望进行可靠的认证,对安全的要求较高,所以需要配置CHAP认证且认证方需要配置

    2024年02月07日
    浏览(40)
  • Spring Boot入门(09):使用MyBatis的XML配置方式访问MySQL实现增删改查 | 超级详细,建议收藏

            想要快速高效地开发Java Web应用程序,选择使用Spring Boot和MyBatis无疑是明智之举。本篇文章将教你使用MyBatis的XML配置方式,结合MySQL数据库,实现常见的增删改查操作,让你的应用程序更加实用和强大。跟随本文一起来探索MyBatis在Spring Boot中的力量吧!        

    2024年02月13日
    浏览(43)
  • Spring Boot 最新版3.x 集成 OAuth 2.0实现认证授权服务、第三方应用客户端以及资源服务

    Spring Boot 3 已经发布一段时间,网上关于 Spring Boot 3 的资料不是很多,本着对新技术的热情,学习和研究了大量 Spring Boot 3 新功能和新特性,感兴趣的同学可以参考 Spring 官方资料全面详细的新功能/新改进介绍 Spring 版本升级到6.x JDK版本至少17+ … 新特性有很多,本文主要针对

    2024年02月02日
    浏览(68)
  • Spring Cloud Gateway集成Swagger实现微服务接口文档统一管理及登录访问

    本文将介绍如何在 Spring Cloud 微服务中使用 Swagger 网关来统一管理所有微服务的接口文档,并通过 Spring Security 实现登录后才能访问 Swagger 文档,以确保接口数据的安全访问。 在开始之前,需要假设你已经完成了 Spring Cloud Gateway 的相关配置,并且已经了解了基本的网关配置知

    2024年02月05日
    浏览(42)
  • 轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码

    轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码。 在互联网信息爆炸的时代,网址复杂而冗长,很难在口头告知他人,也难以分享到社交媒体上。因此,网址缩短服务应运而生。本文将介绍其中的一

    2024年01月23日
    浏览(37)
  • 超详细!完整版!基于spring对外开放接口的签名认证方案(拦截器方式)

    由于项目需要开发第三方接口给多个供应商,为保证Api接口的安全性,遂采用Api接口签名验证。 请求发起时间得在限制范围内 请求的用户是否真实存在 是否存在重复请求 请求参数是否被篡改 1、服务端生成一对 accessKey/secretKey密钥对,将 accessKey公开给客户端,将 secretKey 保

    2024年01月22日
    浏览(53)
  • 【Java开发】Spring Cloud 11:Gateway 配置 ssl 证书(https、http、域名访问)

    最近研究给微服务项目配置 ssl 证书,如此才可以对接微信小程序(需要使用 https 请求)。传统单体项目来说,首先往项目中添加证书文件,然后在配置文件中配置 ssl 证书路径、密码等相关信息;那么微服务这么多项目,总不能一个个配置 ssl 证书,最后发现可以直接通过网

    2024年02月08日
    浏览(72)
  • Spring Authorization Server入门 (十六) Spring Cloud Gateway对接认证服务

            之前虽然单独讲过Security Client和Resource Server的对接,但是都是基于Spring webmvc的,Gateway这种非阻塞式的网关是基于webflux的,对于集成Security相关内容略有不同,且涉及到代理其它微服务,所以会稍微比较麻烦些,今天就带大家来实现Gateway网关对接OAuth2认证服务。

    2024年02月10日
    浏览(64)
  • Spring Boot OAuth2 认证服务器搭建及授权码认证演示

    本篇使用JDK版本是1.8,需要搭建一个OAuth 2.0的认证服务器,用于实现各个系统的单点登录。 这里选择Spring Boot+Spring Security + Spring Authorization Server 实现,具体的版本选择如下: Spirng Boot 2.7.14 , Spring Boot 目前的最新版本是 3.1.2,在官方的介绍中, Spring Boot 3.x 需要JDK 17及以上的

    2024年02月15日
    浏览(48)
  • 搭建spring security oauth2认证授权服务器

    下面是在spring security项目的基础上搭建spring security oauth2认证授权服务器 spring security oauth2认证授权服务器主要需要以下依赖 Spring Security对OAuth2默认可访问端点 ​/oauth/authorize​ ​​:申请授权码code,涉及类​ ​AuthorizationEndpoint​ ​ ​/oauth/token​ ​​:获取令牌token,涉及类​

    2024年01月21日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包