Nginx 配置双证书(RSA、ECC)

Nginx 配置双证书(RSA、ECC)

昨天博客 SSL 证书到期了,需要重新申请;申请的时候想起来有 ECC 证书,于是也一起申请了。

介绍

在通讯过程中,HTTPS 借助 TLS/SLL 和证书机制确保了通讯数据的保密性、真实性、完整性。TSL/SSL 在加密过程中需要用到对称内容加密和非对称密钥交换两种算法。

常见的非对称密钥交换算法有基于整数因式分解问题的 RSA 和基于椭圆曲线离散对数问题(ECDLP)的 ECDHE 两种。ECDHE 和 RSA 相比,前者密钥长度更短,计算速度高,耗费的资源更少,且支持 PFS(Perfect Forward Secrecy);但并不是所有浏览器都支持 ECDHE,也就是 ECC 证书在兼容性方面不如 RSA 证书。

Android 需要 Android 4+ 才支持

Nginx 1.11.0 开始会根据 CipherSuite 返回不同的证书,如果支持 ECDSA,则发送 ECC 证书给浏览器;如果不支持,则发送 RSA 证书。

考虑到网站的更好的体验,为了尝试 ECC 证书,将 Nginx 升级到最新版,准备开启双证书之旅。

申请 ECC 证书

Letsencrypt

通过 acme.sh 从 letsencrypt 申请免费证书

  1. 安装 acme.sh

    1
    curl https://get.acme.sh | sh
  2. 生成证书

    1
    2
    # 申请 RSA 证书
    acme.sh --issue -d example.com -w /home/wwwroot/example.com

    1
    2
    3
    4
    5
    # 申请 ECC 256 位证书
    acme.sh --issue -d example.com -w /home/wwwroot/example.com --keylength ec-256

    # 申请 ECC 384 位证书
    acme.sh --issue -d example.com -w /home/wwwroot/example.com --keylength ec-384

  1. 复制证书到证书目录

    1
    2
    3
    4
    5
    # 复制 RSA 证书
    acme.sh --installcert -d example.com
    --key-file /path/to/keyfile/in/nginx/rsa.key.pem
    --fullchain-file /path/to/fullchain/nginx/rsa.cert.pem
    --reloadcmd "service nginx force-reload"
    1
    2
    3
    4
    5
    # 复制 ECC 证书
    acme.sh --install-cert -d example.com --ecc
    --key-file /path/to/keyfile/in/nginx/rsa.key.pem
    --fullchain-file /path/to/fullchain/nginx/rsa.cert.pem
    --reloadcmd "service nginx force-reload"

七牛云

七牛云提供免费的 RSA 和 ECC 证书的申请渠道

然后将签发的证书放入服务器证书目录下。

配置 Nginx

修改 Nginx 配置文件,添加 ECC 证书路径并调整 Ciphers,最后重启 Nginx。

1
2
3
4
5
6
7
8
9
10
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:!MD5;

# RSA Certificate
ssl_certificate /home/ssl/server.crt;
ssl_certificate_key /home/ssl/server.key;

# ECC Certificate
ssl_certificate /home/ssl/server.ecc.cer;
ssl_certificate_key /home/ssl/server.ecc.key;

对比

配置 ECC 和 RSA 证书后,对比两个证书,可以很直观的看出来 ECC 证书(256 Bits)体积比 RSA (2048 Bits)小。