使用jdk自带keytool自签SSL证书
一.SSL基础理论知识
1.什么是SSL?
SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。(来自百度百科)
2.SSL原理
通过上面两张图总结基本原理(图片转载来自:https://blog.csdn.net/weixin_43207056/article/details/103846900)
①首先通过SSL证书基于非对称加密确定秘钥(非对称加密理解:有公钥和私钥之分,公钥加密的数据只能私钥能解开,私钥加密的数据只能公钥能解开)
②然后再通过得到的秘钥进行对称加密传输数据(对称加密理解:只有一个秘钥,加密和解密都使用这一个秘钥)
二.证书制作
通过上面的SSL基础理论知识可以知道基于SSL通讯中起至关重要的就是证书,其一为放在服务器的证书,其二为面向客户端的证书,放在服务器的证书应当包含公钥的私钥,而面向客户端的证书只应包含公钥。
注:SSL分单向验证和双向验证
- 单向验证指只需服务器持有包含公钥和私钥的证书,当客户端和服务器通讯时,服务端把包只含公钥的证书信息发给客户端,由客户端验证其证书真实性,验证通过后便可以进行数据传输(几乎所有https网站为单向验证)。
- 双向验证指客户端和服务端均持有包含公钥和私钥的证书,当客户端和服务器通讯时,客户端会把自己只包含公钥的证书信息发送给服务端,服务端验证其真实性后,服务端再把自己包只含公钥的证书发给客户端,由客户端验证其证书真实性,双方均验证通过后便可以进行数据传输。
1.制作包含公钥和私钥的证书
keytool -genkeypair -alias server-ks -keyalg RSA -keypass 123456 -keystore E:\自制证书\server-ks.jks -validity 3650 -storepass 123456
- genkeypair-生成证书命令
- alias-证书别名
- keyalg-证书算法
- keypass-证书密码
- keystore-证书文件路径
- validity-证书有效期(单位:天)
- storepass-保持和keypass一致
2.转换证书格式(非必须)
第一步生成的证书格式为JKS,jks是JAVA的keytools证书工具支持的证书私钥格式,可将其转换为行业标准格式PKCS12
keytool -importkeystore -srckeystore E:\自制证书\server-ks.jks -destkeystore E:\自制证书\server-ks.jks -deststoretype pkcs12
- importkeystore-导入证书命令
- srckeystore-原证书路径
- destkeystore-新生成的证书路径
- deststoretype-新证书格式
3.根据server-ks.jks导出只包括公钥信息的cer文件(cer文件只包含公钥信息)
keytool -export -alias server-ks -keystore E:\自制证书\server-ks.jks -storepass 123456 -file E:\自制证书\server-ks.cer
- export-导出命令
- alias-需要导出证书的
- storepass-需要导出证书的密码
- file-导出证书的路径
4.导入只包含公钥的cer证书
keytool -import -alias server-public-ks -file E:\自制证书\server-ks.cer -keystore E:\自制证书\server-public-ks.jks -storepass 123456
- import-证书导入命令
- alias-导入后的别名
- file-需要导入的cer证书路径
- keystore-生成公钥证书路径
- storepass-证书库密码
这样就得到了两个证书文件
- server-ks.jks(包含公钥和私钥的服务器证书)
- server-public-ks.jks(只包含公钥信息的客户端证书)
注意:如果想要双向验证,重复证书制作,修改别名和密码,再生成一对证书即可