# 在 Nginx 中配置 ECC+RSA 双证书

- Link: https://www.xuepaijie.com/html/skill/devops/977.html
- Published: 2017-09-28T20:14:58+08:00
- Author: Admin

为何会出现ECC证书？原因在于RSA算法过于庞大，不适于移动端运行。采用RSA算法的SSL证书，
已经开始应用于移动互联网。为了确保加密强度，目前SSL证书普遍采用的2048位以上RSA加密
算法，但由于移动设备加解密计算能力有限，内存和联网带宽也有限，在移动端运行2048位
RSA算法仍是一个较大的挑战，特别是在用户的移动网络仅有2G GPRS时几乎无法完成证书公
钥的下载与证书链验证。

ECC算法与RSA算法最大的不同就是，ECC的密钥长度远比RSA短。ECC密钥长度只有256位，是
RSA密钥长度的十二分之一，却能实现与RSA同等的加密强度，而且ECC算法加解密速度更快，
存储空间占用更小，带宽要求更低，其短小精悍的特点，尤其适用于移动互联网环境。

需要升级证书以支持ECC，那么环境上需要满足：

    ```html;
    Nginx 1.11.0+
    OpenSSL 1.0.2+
    ```

申请 ECC 证书这个环节不说了，请参考本站相关文章。取得ECC证书之后，按正常的证书配置
方式配置上去，参考如下：

首先是将两个证书链都加入 Nginx 的配置文件：

    ```html;
    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;
    ```

如果要使用 CT 的话有两种方法：

一个是将两个证书的 CT 信息放到同一目录，并做如下设置：

    ```html;
    ssl_ct on;
    ssl_ct_static_scts /path/to/sct/dir;
    ```

这样 Nginx CT 模块会自动在这个目录下查找相应证书的 CT 信息并发送验证，另外也可以
单独配置每个证书的 CT 文件：

    ```html;
    ssl_ct on;

    ssl_certificate example.com.rsa.crt;
    ssl_certificate_key example.com.rsa.key;
    ssl_ct_static_scts xample.com.rsa.scts;

    ssl_certificate example.com.ecdsa.crt;
    ssl_certificate_key example.com.ecdsa.key;
    ssl_ct_static_scts example.com.ecdsa.scts;
    ```

然后问题来了。很多人员这么配置之后可能发现使用支持 ECC 的浏览器却并没有启用 ECC 
证书。这是为什么呢？问题就出在   ssl_ciphers  这个配置项上面。

当我们配置的 ssl_ciphers 内的套件顺序不一样，浏览器在协商时会优先使用排位靠前的套
件，这时，若你的RSA方式在前，那就会选择RSA咯。

通过 openssl 命令可以验证：

    ```html;
    openssl ciphers -V '你的 ssl_ciphers 套件信息' | column -t
    ```

通过执行命令检查，就可以看到加密套件配置中，椭圆曲线的套件队列情况，只要调整顺序（
前置）就可以加大协商出支持椭圆曲线算法的套件的可能性。

我们贴一个示例下：

    ```html;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
    ```
