使用openssl命令生成ECC、RSA证书

1、关于ECC证书和RSA证书
在 RSA 密钥交换中,浏览器使用证书提供的 RSA 公钥加密相关信息,如果服务端能解密,意味着服务端拥有证书对应的私钥,同时也能算出对称加密所需密钥。密钥交换和服务端认证合并在一起。
在 ECDHE 密钥交换中,服务端使用证书私钥对相关信息进行签名,如果浏览器能用证书公钥验证签名,就说明服务端确实拥有对应私钥,从而完成了服务端认证。密钥交换和服务端认证是完全分开的。

可用于 ECDHE 数字签名的算法主要有 RSA 和 ECDSA,也就是目前密钥交换 + 签名目前有三种主流的方式:
RSA 密钥交换(无需签名)
ECDHE 密钥交换、RSA 签名
ECDHE 密钥交换、ECDSA 签名

内置 ECDSA 公钥的证书一般被称之为 ECC 证书,内置 RSA 公钥的证书就是 RSA 证书。由于 256 位 ECC Key 在安全性上等同于 3072 位 RSA Key,加上 ECC 运算速度更快,ECDHE 密钥交换 + ECDSA 数字签名无疑是最好的选择。由于同等安全条件下,ECC 算法所需的 Key 更短,所以 ECC 证书文件体积比 RSA 证书要小一些。
RSA 证书可以用于 RSA 密钥交换(RSA 非对称加密)或 ECDHE 密钥交换(RSA 非对称签名);而 ECC 证书只能用于 ECDHE 密钥交换(ECDSA 非对称签名)。
并不是所有浏览器都支持 ECDHE 密钥交换,也就是说 ECC 证书的兼容性要差一些。例如在 Windows XP 中,使用 ECC 证书的网站只有 Firefox 能访问(Firefox 的 TLS 自己实现,不依赖操作系统);Android 平台中,也需要 Android 4+ 才支持 ECC 证书。

好消息是,Nginx 1.11.0 开始提供了对 RSA/ECC 双证书的支持。它的实现原理是:分析在 TLS 握手中双方协商得到的 Cipher Suite,如果支持 ECDSA 就返回 ECC 证书,否则返回 RSA 证书。
也就是说,配合最新的 Nginx,我们可以使用 ECC 证书为现代浏览器提供更好的体验,同时老旧浏览器依然会得到 RSA 证书,从而保证了兼容性。这一次,鱼与熊掌可以兼得。

2、关于x509命令
伪命令x509可以像openssl ca一样对证书或请求执行签名动作。注意,openssl x509 不读取配置文件,所有的一切配置都由x509自行提供,所以openssl x509像是一个"mini CA"使用x509工具自建CA。
由于x509无法建立证书请求文件,所以只能使用openssl req来生成请求文件,然后使用x509来自签署。
自签署时,使用"-req"选项明确表示输入文件为证书请求文件,否则将默认以为是证书文件,再使用"-signkey"提供自签署时使用的私钥。
openssl req -new -keyout key.pem -out req.csr
openssl x509 -req -in req.csr -signkey key.pem -out x509.crt
x509也可以用来签署他人的证书请求,即为他人颁发证书。注意,为他人颁发证书时,确保serial文件存在,建议使用自动创建的选项"-CAcreateserial"。
openssl x509 -req -in req.csr -CA ca.crt -CAkey ca.key -out x509.crt -CAcreateserial

3、生成ECC证书

使用命令openssl ecparam生成ecdsa密钥(-name 参数 prime256v1 或者secp384r1。 256bit 其实安全性和速度都足够了.)

openssl ecparam -name prime256v1 -genkey -out EccCA.key

对密钥进行口令保护(可选)

openssl ec -in EccCA.key -des -passout pass:"123456" -out EccCA.key

使用命令openssl req生成ECDSA证书请求

openssl req -new -key EccCA.key -out EccCA.req -subj "/C=CN/ST=Shanxi/L=Xi'an/O=Huawei/OU=IT/CN=.*"

使用命令openssl x509签发证书

openssl x509 -req -in EccCA.req -signkey EccCA.key -out EccCA.pem

使用命令openssl ecparam生成ecdsa密钥

openssl ecparam -name prime256v1 -genkey -out EccSite.key

使用命令openssl req生成ECDSA证书请求

openssl req -new -key EccSite.key -out EccSite.req -subj "/C=CN/ST=Shanxi/L=Xi'an/O=Huawei/OU=IT/CN=.*"

使用命令openssl x509签发证书

openssl x509 -req -in EccSite.req -CA EccCA.pem -CAkey EccCA.key -out EccSite.pem -CAcreateserial

4、生成RSA证书

生成rsa密钥使用命令openssl genrsa

openssl genrsa -out server.key 2048

后续的生成证书申请和签发证书流程跟ECC证书流程一致

5、生成pkcs12文件
1)生成pkcs12文件,但不包含CA证书:
openssl pkcs12 -export -inkey ocspserverkey.pem -in ocspservercert.pem -out ocspserverpkcs12.pfx
2) 生成pcs12文件,包含CA证书:
openssl pkcs12 -export -inkey server.key -in server.crt -CAfileca.crt -chain -out server.pfx
3) 将pcks12中的信息分离出来,写入文件:
openssl pkcs12 –in ocsp1.pfx -out certandkey.pem
4) 显示pkcs12信息:
openssl pkcs12 –in ocsp1.pfx -info
------------------------------------
附: 1、把cert1.pem转换成.p12格式
openssl pkcs12 -export -in cert1.pem -inkey cert1.key -certfile ca.pem -out cert1.p12
2、把cert1.pem转换成.cer格式:只需把扩展名改为.cer即可.

6、查看私钥信息
ECC私钥
openssl ec -in EccSite.key -noout -text
RSA私钥则使用openssl rsa命令

7、查看公钥信息
openssl x509 -in EccSite.pem -noout -text

8、查看加密套件
openssl ciphers -V 'EECDH+AES128' | column -t
0xC0,0x2F - ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD
0xC0,0x2B - ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD
0xC0,0x27 - ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256
0xC0,0x23 - ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA256
0xC0,0x13 - ECDHE-RSA-AES128-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA1
0xC0,0x09 - ECDHE-ECDSA-AES128-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA1

可以看到,使用 RSA 做为签名认证算法(Au=RSA)的加密套件排到了前面,会导致 Nginx 作出错误判断,优先提供RSA证书,而不是ECDSA证书。

9、分享5个自动生成证书的工具脚本
参考留哥写的rsa证书生成脚本(http://3ms.huawei.com/km/groups/1503235/blogs/details/5239717),我搞了5个自动生成证书的脚本,支持rsa、ecc证书生成,可以使用口令加密,也可以不使用口令加密。

猜你喜欢

转载自www.cnblogs.com/linyihan/p/11234117.html