1 简介
之前文章《Springboot整合https原来这么简单》讲解过一些基础的密码学知识和Springboot
整合HTTPS
。本文将更深入讲解密钥知识和密钥工具。
2 密钥知识-非对称加密
这部分知识非常重要,理解了关键的密钥知识,才能更好地在工作中去使用。需要注意的是,讲的主要是非对称加密的知识,对称加密比较好理解,就不讲述了。
(1)对于非对称加密,密钥分为私钥(private key)和公钥(public key),它们是成对出现的,缺一不可,少一个都无法正常工作。
(2)如果用公钥加密,就必须使用对应的私钥解密,反之亦然。
(3)通常,私钥是自己才拥有,公钥是对外公开发布。因此,在服务器端一般我们使用的是私钥,而在客户端我们使用的则为公钥。所以我们是在服务端使用私钥对来自客户端的用公钥加密的数据进行解密,哈哈,这句话很绕。
(4)即使把公钥公开了,只要密钥长度合理(一般是1024或2048),目前的技术是无法通过公钥来计算出私钥的,所以我们认为它是安全的。
(5)那么我们通过什么来加密、什么来解密呢?从功能上来说,既可以用公钥加密、私钥解密,也可以用私钥加密,公钥解密。但实际上,通常采用的是公钥加密、私钥解密,因为只想密文只有我知道,不希望别人也能获得我的信息,所以要使用私钥来加密。试想想,如果把用私钥加密后的信息暴露出去,而大家都可以拥有公钥,也就意味着大家都可以解密,那我的加密还有什么意义呢?
(6)对于签名功能,我不希望有人来冒充我来签名,所以是私钥签名,公钥验证,这样才能确保签名只属于一个人呀,如果用公钥来签名,那不是大家都可以是南瓜慢说呢?
(7)非对称加密是运算效率比较低的,为了提高效率,可以采用这样的方案:使用非对称加密来交换密钥Key,然后用密钥Key来进行对称加密。不难理解,这个密钥是由客户端生成的,如果服务端来生成,那大家都知道了这个密钥,就失去了意义。
(8)密钥文件是用于存放私钥和公钥的文件,我们可以把私钥和公钥放一起,也可以分开放。而密钥文件有许多格式:jks
、p12
、pem
、cert
等,要根据不用的服务器和客户端选取。
(9)一个密钥文件是可以同时存放多个私钥和公钥的,如.jks
文件可以同时存放localhost
和www.pkslow.com
的私钥。但要注意别名和CN
名是不同的。
(10)生成cert文件的两种方式:
第一种:自己生成密钥和CSR(Certificate Signing Request,证书签名请求文件),把CSR给CA机构,机构会生成一个cert文件给你,然后要把该cert文件导入到自己的密钥文件里。
第二种:直接在CA生成所有,然后会给回private key和cert文件,配置到服务器端使用即可。
(11)如何更新将要过期的cert?
Private Key没有过期时间,可以通过自己的private key生成新的CSR,然后给CA重新生成cert;或者private key也重新生成,参加上面一条。
(12)更新了cert,客户端要不要做什么?
如果是通过CA来验证的,是不需要的。如果是Self-Signed的,需要把cert给客户端然后导入到客户端的密钥文件里。
(13)作为文本格式的时候,密钥的格式如下:
Private Key文件:
-----BEGIN ENCRYPTED PRIVATE KEY-----
XXX
-----END ENCRYPTED PRIVATE KEY-----
CSR文件:
-----BEGIN CERTIFICATE REQUEST-----
XXX
-----END CERTIFICATE REQUEST-----
Public key文件:
-----BEGIN PUBLIC KEY-----
XXX
-----END PUBLIC KEY-----
Cert文件:
-----BEGIN CERTIFICATE-----
XXX
-----END CERTIFICATE-----
3 密钥工具
密钥工具有许多,常用的有openssl
和keytool
。
3.1 keytool常用命令
keytool
是JDK提供的密钥命令行工具,功能强大,语义清晰明了。常用的命令有:
# 生成一个密钥对
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
# 生成CSR文件
keytool -certreq -alias localhost -file localhost.csr -keystore localhost.jks -storepass changeit
# 导出一个cert文件
keytool -export -alias xxx -file xxx.cer -keystore xxx.jks
#导入一个cert文件
keytool -import -alias xxx -file xxx.cer -keystore xxx.jks
# 查看cert列表详情
keytool -list -v -keystore xxx.p12 -storepass changeit -storetype PKCS12
keytool -list -v -keystore xxx.jks -storepass changeit -storetype JKS
#转换JKS格式为P12
keytool -importkeystore -srckeystore xxx.jks -destkeystore xxx.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass changeit -deststorepass changeit -srckeypass changeit -destkeypass changeit -srcalias xxx -destalias xxx -noprompt
更多命令请参考帮助文档或网上吧。
3.2 可视化工具Keystore Explorer
在Linux终端等只能通过命令行方式来操作密钥,但命令和参数这么多,记住是不太可能的,那总不能每次都要上网查吧,万一连不上网了呢?
还好有优秀免费的可视化工具Keystore Explorer,官方网址为https://keystore-explorer.org/index.html ,可以在Windows或Mac开发使用,最后再把文件上传到服务器即可。界面如下:
非常简单易用又功能强大,大大减少了记忆劳动。不管是生成Key、导入导出、转换格式、生成CSR等,都很容易。所以,就不一一截图介绍了。
4 总结
本文主要讲解了密钥知识和密钥工具。密钥知识比较重要,暂时就想到这些,以后再慢慢补充,最新文章可以到(www.pkslow.com) 访问。密钥工具有命令行工具和可视化工具,大家按自己需求选择。