Nginx启用RSA/ECC双证书

我在之前的一篇帖子中已提到过双证书配置
这篇帖子会介绍如何为 Nginx 启用 RSA/ECC 双证书配置

RSA 和 ECC 证书

内置 ECDSA 公钥的证书称为 ECC 证书,内置 RSA 公钥的证书称为 RSA 证书
安全性方面,256 位 ECC Key 等同于 3072 位 RSA Key
运算速度上,ECC 运算速度 更快
且由于同等安全条件下,ECC 算法所需的 Key 更短,所以 ECC 证书拥有比 RSA 证书 更小的文件体积
那么综上,ECDHE 密钥交换 + ECDSA 数字签名无疑是坠吼滴选择。

那么问题来了,你说 ECC 是坠吼滴,那还为什么要加 RSA 搞个双证书呢?
那是因为,ECC 虽好,但有一个缺点:
并不是所有浏览器都支持 ECDHE 密钥交换,也就是说 ECC 证书的兼容性要差一些。例如在 Windows XP 中,使用 ECC 证书的网站时需要浏览器自行 TLS(例如 Firefox 的 TLS 自己实现,不依赖操作系统);Android 平台中,也需要 Android 4+ 才支持 ECC 证书。

而这时,好消息是
Nginx 1.11.0 版本开始提供 RSA/ECC 双证书的支持
它的实现原理是:分析在 TLS 握手中双方协商得到的 Cipher Suite,若支持 ECDSA 就返回 ECC 证书,反之返回 RSA 证书。

Nginx 双证书配置

按照本站示例,替换为你的即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#将SSL站点配置为以下样式
#本站已启用 ECC/RSA 双证书
#指定两份证书即可
#Let's Encrypt的ECC证书
ssl_certificate /home/Site/blog/crt/LetsEncrypt/LetsEncrypt.cer;
ssl_certificate_key /home/Site/blog/crt/LetsEncrypt/LetsEncrypt.key;
#TrustAsia的RSA证书
ssl_certificate /home/Site/blog/crt/TrustAsia/TrustAsia.crt;
ssl_certificate_key /home/Site/blog/crt/TrustAsia/TrustAsia.key;
#优先采取服务器算法
ssl_prefer_server_ciphers on;
#定义算法
#本站额外加入TLS1.3和双证书支持
ssl_ciphers "TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-CCM-SHA256:TLS13-AES-128-CCM-8-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5";