Springboot整合https原来这么简单

1 简介

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

2 密码学基础

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

2.1 密码体制

要创建一个密码体制,须要由五个空间组成,分别是:算法

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

如图所示:spring

Cryptography

2.2 两种加密方式

2.2.1 对称加密

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

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

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

表明算法:DES算法、AES算法;微信

举个小例子app

明文为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算法;

举个大例子

步骤以下:

Step Description Formula Note
1 找出两个质数 P、Q
2 计算公共模数 N=P*Q
3 计算欧拉函数 φ(N) = (P-1)(Q-1)
4 计算公钥E 1 < E < φ(N) E的取值必须是整数 E 和 φ(N) 必须是互质数
5 计算私钥D E * D % φ(N) = 1
6 加密 C = M^E mod N C:密文 M:明文
7 解密 M =C^D mod N C:密文 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应用起来了。

HTTP

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

重启后访问以下:

HTTPS Fail

发现有红色警告,由于这是自签名的cert,并不被Chrome所承认,因此会校验失败。之前的Chrome版本只是警告,但仍是能够访问的,如今新版本的已经不能访问了。

经过Postman来访问即可:

Https 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。本文详细代码可在南瓜慢说公众号回复<SpringbootSSLBasic>获取。

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


欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章!

欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

多读书,多分享;多写做,多整理。

相关文章
相关标签/搜索