生成 ssl 证书
keytool.exe -genkey -alias test -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore test.p12 -validity 3650
完整过程:
C:\Users\Mr yang>keytool.exe -genkey -alias test -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore test.p12 -validity 3650
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: li
您的组织单位名称是什么?
[Unknown]: yz
您的组织名称是什么?
[Unknown]: yz
您所在的城市或区域名称是什么?
[Unknown]: gz
您所在的省/市/自治区名称是什么?
[Unknown]: gd
该单位的双字母国家/地区代码是什么?
[Unknown]: china
CN=li, OU=yz, O=yz, L=gz, ST=gd, C=china是否正确?
[否]: y
-genkey: 生成SSL证书
-alias: 证书别名
-storetype: 秘钥仓库类型
-keyalg: 生成证书算法
-keysize: 证书大小
-keystore: 生成证书保存路径
-validity: 证书有效期
因为没有指定存储路径,默认以命令执行路径作为证书保存路径,生成完成 C:\Users\Mr yang 下即可找到名为 test.p12 的证书文件
配置 ssl 证书
把证书放到资源根中
增加配置项:
# ssl证书路径
server.ssl.key-store=classpath:test.p12
# 别名
server.ssl.key-alias=test
# 证书设置密码
server.ssl.key-store-password=123456
访问测试
http 访问失败
https 访问成功
把证书添加到信任库
因为是用 keytools 生成的,所以并不被认可,此时可以通过手动的方式奖服务器证书导入到客户端的信任证书库中,让客户端信任这个证书
keytool -import -alias client -file test.cer -keystore servertrust.keystore
-file 要导入的证书文件(test.cer 既从服务端下载的证书)
-keystore 要导入的证书库(servertrust.keystore 既服务信任证书库)
完整过程:
C:\Users\Mr yang>keytool -import -alias client -file test.cer -keystore servertrust.keystore
输入密钥库口令:
再次输入新口令:
所有者: CN=li, OU=yz, O=yz, L=gz, ST=gd, C=china
发布者: CN=li, OU=yz, O=yz, L=gz, ST=gd, C=china
序列号: 14658239
有效期为 Mon Jul 04 08:53:07 CST 2022 至 Thu Jul 01 08:53:07 CST 2032
证书指纹:
MD5: 89:B5:25:EA:75:FF:ED:9D:A8:74:03:20:D5:30:EE:D6
SHA1: A9:2C:A2:47:DB:E5:57:0C:69:93:B1:D5:23:B7:BC:F2:CD:06:79:9D
SHA256: CE:70:3F:C2:92:49:4C:6F:44:17:E2:FC:3B:71:9C:0F:A7:77:EC:05:1F:79:AA:16:20:41:AA:EF:DC:89:62:1D
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 61 7F C3 51 C1 39 FD C1 0B 6B 02 71 97 0E 20 42 a..Q.9...k.q.. B
0010: E4 81 4A AD ..J.
]
]
是否信任此证书? [否]: y
证书已添加到密钥库中
查看某个库的信任证书列表
key -list -v -keystore server.keystore
拓展
TLS 握手过程
发送https
请求的时候,还是要与http
一样先走TCP
的三次握手:
然后就开始TLS
握手:TLS
握手过程包含了非对称加密和对称加密两种方式
① 客户端发送自己支持的TLS
版本、自己的加密套件(可以理解为不同的加密算法组合)和一个随机数(第一随机数)
② 服务端接收到后,保存第一随机数,响应自己确认的TLS
版本、选择的加密套件和一个随机数(第二随机数)
③ 服务端发送自己的ssl
证书
④ 服务端发送自己的公钥
⑤ 服务端发送完成信号
⑥ 客户端保存服务端发送过来的第二随机数和公钥、响应一个随机数(第三随机数/预主密钥)回去。
⑦ 服务端此时就用第一随机数
+第二随机数
+第三随机数
通过加密套件生成一个会话密钥,客户端同样如此操作,生成的会话密钥是对称的。此后的数据传输就用这个会话密钥加密数据
所以TLS是先用非对称的方式加密预主密钥,最终是用对称加密的方式传递数据。