信息发布→ 登录 注册 退出

Springboot整合https的实例代码

发布时间:2026-01-11

点击量:
目录
  • 1 简介
  • 2 密码学基础
    • 2.1 密码体制
    • 2.2 两种加密方式
      • 2.2.1 对称加密
      • 2.2.2 非对称加密
    • 2.3 证书
    • 3 Springboot整合HTTPS
      • 3.1 先让Web跑起来
        • 3.2 生成密钥文件jks
          • 3.3 重新配置并重启
            • 3.4 使用PKS12格式
            • 总结

              1 简介

              HTTP是不安全的,我们需要给它套上SSL,让它变成HTTPS。本文章将用实例介绍Springboot整合HTTPS

              2 密码学基础

              要谈https就要谈Security,自然就要谈安全;谈及安全,就必然涉及密码学的一些知识。

              2.1 密码体制

              要建立一个密码体制,需要由五个空间组成,分别是:

              • 明文M:加密前或解密后的信息;
              • 密文C:明文加密后的信息;
              • 密钥K:由加密密钥和解密密钥组成;
              • 加密E:从明文到密文的变换;
              • 解密D:从密文到明文的变换。

              如图所示:

              2.2 两种加密方式

              2.2.1 对称加密

              对称加密,或者也叫单钥加密,是指加密密钥和解密密钥相同(或者容易由一个计算出另一个)的加密方式。

              对称加密的主要优势是:加密、解密运算速度快,效率高;

              局限性:密钥分发复杂,密钥管理困难,保密通信系统开放性差,数字签名;

              代表算法:DES算法、AES算法;

              举个小例子:

              明文为48,加密算法f(x)=8x+71,
              则密文C=8*48+71=455
              则解密算法为f(x)=(x-71)/8;
              则解密后的明文M=(455-71)/8=48;

              2.2.2 非对称加密

              非对称加密是指加密和解密分别使用不同的密钥,并且不能由加密密钥推导出解密密钥的加密方式。

              主要优势:密钥分配简单,便于管理,系统开放性好,可以实现数字签名;

              局限性:加密、解密运算效率较低;

              代表算法:RSA算法、ECC算法;

              举个大例子:

              步骤如下:

              StepDescriptionFormulaNote
              1找出两个质数P、Q 
              2计算公共模数N=P*Q 
              3计算欧拉函数φ(N) = (P-1)(Q-1) 
              4计算公钥E1 < E < φ(N)E的取值必须是整数 E 和 φ(N) 必须是互质数
              5计算私钥DE * D % φ(N) = 1 
              6加密C = M^E mod NC:密文 M:明文
              7解密M =C^D mod NC:密文 M:明文

              其中,公钥=(E , N) ,私钥=(D, N),对外,我们只暴露公钥。

              1.找出两个质数
              随便找两个质数,我们找P=5,Q=11。

              2.计算公共模数
              公共模数N=P*Q=5*11=55
              3.计算欧拉函数
              φ(N) = (P-1)(Q-1)=4*10=40
              4.计算公钥E
              1 < E < φ(N),我们取E=13
              5.计算私钥D
              (13*D)%40=1,则取D=37
              6.加密
              假设要传输的明文为8,使用公钥(E,N)=(13,55)加密
              通过公式C = M^E mod N=8^13%55=28
              7.解密
              使用密钥(D,N)=(37,55)解密
              解密M =C^D mod N=28^37%55=8
              另外,我们可以用私钥加密,公钥解密,
              如明文为2,则用私钥(37,55)加密密文C=(2^37)%55=7
              用公钥(13,55)解密M=(7^13)%55=2。

              至此,整个非对称加密过程演示了一遍,希望大家能理解,特别是非对称加密,因为HTTPS使用的是非对称加密。实际的使用算法更复杂,密钥长度会更大。

              2.3 证书

              要使用SSL,需要有证书,这个证书文件是包含公钥密钥,也就是非对称加密中要使用的。

              获取证书有两种方式:

              • 从CA(Certificate Authority)机构获取,即客户端会认可的证书,具有公信力;有免费也有收费的,收费的比较稳定比较安全。
              • 自签证书,自己制作证书,一般用于测试,浏览器不承认。

              为方便起见,在本次实例中使用自签证书,两种证书整合过程并无差异。

              3 Springboot整合HTTPS

              3.1 先让Web跑起来

              作为一个Web应用,我们先让它跑起来,然后再整合https

              (1)引入Web依赖:

              <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
              </dependency>

              (2)配置端口:

              server.port=80

              (3)实现Contrlloer

              @RestController
              public class HelloController {
                  @GetMapping("/hello")
                  public String hello() {
                      return "Welcome to www.pkslow.com";
                  }
              }

              完成上面工作后,启动应用即可。

              访问http://localhost/hello 得到下面结果,说明整个Web应用起来了。

              3.2 生成密钥文件jks

              通过命令行生成密钥文件如下:

              keytool -genkey -alias localhost -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore localhost.jks -dname CN=localhost,OU=Test,O=pkslow,L=Guangzhou,C=CN -validity 731 -storepass changeit -keypass changeit

              命令行重要参数的意义:

              • alias:密钥别名,可以随便起,不冲突就行;
              • keyalg:加密算法;
              • keysize:密钥长度,2048基本就不可能破解了;
              • keystore:keystore的文件名;
              • dname:这个很关键,特别是CN=后面要按正确的域名来写;
              • validity:cert的有效期;

              执行完以上命令后,就会生成localhost.jks文件,把该文件放到classpath下即可,当然也可以放到其它位置,配置文件指定正确即可。

              3.3 重新配置并重启

              按照实际情况重新配置application.properties文件:

              server.port=443
              server.ssl.enabled=true
              server.ssl.key-store-type=jks
              server.ssl.key-store=classpath:localhost.jks
              server.ssl.key-store-password=changeit
              server.ssl.key-alias=localhost

              重启后访问如下:

              发现有红色警告,因为这是自签名的cert,并不被Chrome所认可,所以会校验失败。以前的Chrome版本只是警告,但还是可以访问的,现在新版本的已经不能访问了。

              通过Postman来访问便可:

              3.4 使用PKS12格式

              如果想使用PKCS12替换JKS,命令和配置可以参考下面:

              生成密钥:

              keytool -genkey -alias localhost -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -storetype PKCS12 -keystore localhost.p12 -dname CN=localhost,OU=Test,O=pkslow,L=Guangzhou,C=CN -validity 731 -storepass changeit -keypass changeit

              配置文件如下:

              server.port=443
              server.ssl.enabled=true
              server.ssl.key-store-type=PKCS12
              server.ssl.key-store=classpath:localhost.p12
              server.ssl.key-store-password=changeit
              server.ssl.key-alias=localhost

              总结

              本文简单介绍了一些密码学的基础和如何通过Springboot整合HTTPS

              其实,SSL非常复杂,知识点非常多。后续文章会继续介绍密钥工具、重定向、Reactive整合、双向验证等。

              详细代码从下面百度网盘获取吧!

              链接: https://pan.baidu.com/s/1rVyLYG_HM1qnR6Jz0lAhlw?pwd=2iy4

              提取码: 2iy4

              在线客服
              服务热线

              服务热线

              4008888355

              微信咨询
              二维码
              返回顶部
              ×二维码

              截屏,微信识别二维码

              打开微信

              微信号已复制,请打开微信添加咨询详情!