南琴浪博客

Nginx 启用 RSA && ECC 双证书

11/02/2017

这篇帖子介绍如何为 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 双证书配置

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

    #将 SSL 部分的站点配置为以下样式

    #指定两份证书即可

    #Let's Encrypt的 ECC 证书
    ssl_certificate ~/LetsEncryptecc-chained.cer;
    ssl_certificate_key ~/LetsEncryptecc.key;

    #Let's Encrypt的 RSA 证书
    ssl_certificate ~/LetsEncryptrsa-chained.cer;
    ssl_certificate_key ~/LetsEncryptrsa.key;

    #优先采取服务器算法
    ssl_prefer_server_ciphers on;

    #定义算法
    ssl_ciphers "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";

关于 HTTPS 的配置方法,请看 Nginx 启用 HTTPS 站点