前段时间,在做 https 的协议解密工作,所以对公开密钥算法等有了初步的了解,用本篇文章梳理下,参考《深入浅出HTTPS 从原理到实践》,学习https必备的好书,内容很详实,推荐!
一 简介
公开密钥算法其实不是一个算法,包含一组算法,包括加密和数据完整性保护算法等。只所以叫公开密钥算法是因为它有一对密钥,一个是公钥,一个是私钥。公钥可以公开。和常用的对称加密算法有所不同,对称加密算法的密钥只有一个;
此外,公开密钥算法不仅仅用于数据加密,还用于密码协商,数字签名。公开密钥算法进行加密的时候,安全性一般比较好,当时性能比较差,一般不作为主力用在数据的加解密上,比如 HTTPS 中用公开密钥算法进行密钥的协商。
二 RSA 密钥
RSA 是公开密钥算法中最常用和最重要的算法(解密也只能针对这个协议解密),它和对称密钥算法的密钥不同,RSA 算法中的公钥和私钥是由很多参数组成,不是简单的数字,一般采用文件方式提供。具体格式就不说了,总之 RSA 算法通过离散对数模型来保障算法的安全性,当然也和密钥长度有关,一个长度为 2048 的密钥算法被认为是安全的。加密安全与否,除了与密钥长度有关,还和使用方式,比如填充标准有关。公开密钥算法也有使用标准,称为 PKCS,按照目前常用的规定填充标准方式填充(RSAES-OAEP 和 RSAES-PKCS1-V1-5),通过这些标准可以保障相同的内容,同样的密钥,每次加密后的内容不同,进一步保障了加密的安全性。
三 实践
3.1 生成 RSA 密钥对
openssl genrsa -out key.pem 2048
#输出密钥信息
openssl rsa -in mykey.pem -text
这种方式生成后,如果不加保护,不安全,可以通过以下命令保护:
openssl genrsa -des3 -out passkey.pem 2048
从密钥对中提取公钥和私钥。
openssl rsa -in mykey.pem -pubout -out mypub.pem
3.2 用 RSA 加解密
如果有什么重要的文件,需要加密的,我觉得用这种非对称加密算法自己手工加密是很好的方式,只是别忘记了口令。
[root@localhost log]# echo "hello world" >a.txt
[root@localhost log]# openssl rsautl -encrypt -pubin -inkey mypub.pem -in a.txt -out ciphere.log
[root@localhost log]# openssl rsautl -decrypt -inkey mykey.pem -in ciphere.log
hello world
3.3 自签名证书生成
我们一般开发测试 https 的时候,用的证书都是自签名证书,也就是自己生成的证书,没有正规 CA 认证,浏览器访问的时候,会有个告警,忽略即可。以 rsa 为例说明:
生成密钥对
openssl genrsa -out mykey.pem 2048
这个和上一步一样。
生成证书签名请求文件 CSR(Certificate Signing Request) 里面除了公私钥,还包含用户名称,签发者,还有 common name(对应域名信息)等。命令如下:
[root@localhost log]# openssl req -new -key mykey.pem -out my.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:sichuan
Locality Name (eg, city) []:chengdou
....
....
输入一些信息后,生成了 csr 文件。
生成自签名证书
openssl x509 -signkey mykey.pem -in my.csr -req -days 36500 -out cert.pem
说明:-signkey 后面指定使用的密钥对文件。-in 后面跟着我们刚才生成的 csr 文件 -days 标识有效期,上面命令为 10 年。cert.pem 为最终生成的证书。
四 证书格式转换
4.1 X509 到 P12
PCKCS#12 是另外一种常见的格式,多用在 tomcat,java 或安卓的客户端上,后缀一般是:.pkcs12,.pfx,.p12,它是将证书和密钥打包成一个文件管理。
从 X509 转成 p12 格式 不同的 web 服务器,采用的证书格式有所差别,有时候我们需要转换证书格式,如下:
#x509转pkcs12
openssl pkcs12 -export -in cert.pem -inkey cert.pem -out server.p12
#pkcs12 转509格式
openssl pkcs12 -in server.p12 -out certificate.cer
#从pkcs12中提取私钥
openssl pkcs12 -in mycert.p12 -nocerts -nodes -out mycert.pem
如果刚才在生成证书的时候,设置了密码这里面要输入密码才可以生成 p12 格式的证书。
4.2 X509 到 p7b
PCKCS#7 是另外一种常见格式,文件后缀一般为.p7b 和.p7c。x509 转 PCKCS#7 命令如下:
openssl crl2pkcs7 -nocrl -certfile cert.pem -certfile CACert.cer -out certificate.p7b
说明:-certfile 指定服务器证书或中间服务器证书 -out 指定输出的文件 -nocrl 不加载证书对应的 CRL 文件。(包含被吊销证书的序列号文件)
五 诗词欣赏
渔家傲·秋思
宋:范仲淹
塞下秋来风景异。
衡阳雁去无留意。
四面边声连角起。
千嶂里。长烟落日孤城闭。
浊酒一杯家万里。
燕然未勒归无计。
羌管悠悠霜满地。
人不寐。将军白发征夫泪。