之前经常有听说 ECC 证书,它体积小,速度快,但是不兼容旧的浏览器,所以我也一直只使用 RSA 证书。
但从 Nginx 1.11.0 开始提供了对 RSA/ECC 双证书的支持。它的实现原理是:分析在 TLS 握手中双方协商得到的 Cipher Suite,如果支持 ECDSA 就返回 ECC 证书,否则返回 RSA 证书。也就是说,配合最新的 Nginx,我们可以使用 ECC 证书为现代浏览器提供更好的体验,同时老旧浏览器依然会得到 RSA 证书,从而保证了兼容性。这一次,鱼与熊掌可以兼得。
下面介绍一下如何使用 ECC 证书:
1.申请
如果你的 CA 支持签发 ECC 证书,使用以下命令生成 CSR(Certificate Signing Request,证书签名请求)文件并提交给提供商,就可以获得 ECC 证书:
openssl ecparam -genkey -name secp256r1 | openssl ec -out ecc.key openssl req -new -key ecc.key -out ecc.csr
以上命令中可供选择的算法有 secp256r1 和 secp384r1,secp521r1 已被 Chrome 和 Firefox 废弃,而且 escp256p1 已经足够健壮。
目前很火的 Let’s Encrypt,也支持签发 ECC 证书。我们可以使用 acme.sh 这个小巧的工具来签发证书,指定 -k ec-256
就可以将证书类型改为 ECC:
/PATH/TO/.acme.sh/acme.sh --issue --dns dns_cx -d imququ.com -d www.imququ.com -k ec-256
2.配合 Nginx 使用
有了 RSA/ECC 双证书之后,需要安装 Nginx 1.11.x。
一切准备妥当后,将证书配置改为双份即可:
ssl_certificate example.com.rsa.crt; ssl_certificate_key example.com.rsa.key; ssl_certificate example.com.ecdsa.crt; ssl_certificate_key example.com.ecdsa.key;
修改 Cipher Suites 配置如下,供参考:
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:!MD5;
参考:https://imququ.com/post/ecc-certificate.html