前段时间,在做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为最终生成的证书。
查看证书信息:
openssl x509 -in cert.pem -noout -text
这里面创建的证书格式为x509格式,为方便传输,本身采用base64进行编码,以-----BEGIN CERTIFICATE-----标识开头和-----END CERTIFICATE-----标识结尾。
四 证书格式转换
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文件。(包含被吊销证书的序列号文件)
网友评论