为何会出现ECC证书?原因在于RSA算法过于庞大,不适于移动端运行。采用RSA算法的SSL证书,已经开始应用于移动互联网。为了确保加密强度,目前SSL证书普遍采用的2048位以上RSA加密算法,但由于移动设备加解密计算能力有限,内存和联网带宽也有限,在移动端运行2048位RSA算法仍是一个较大的挑战,特别是在用户的移动网络仅有2G GPRS时几乎无法完成证书公钥的下载与证书链验证。
ECC算法与RSA算法最大的不同就是,ECC的密钥长度远比RSA短。ECC密钥长度只有256位,是RSA密钥长度的十二分之一,却能实现与RSA同等的加密强度,而且ECC算法加解密速度更快,存储空间占用更小,带宽要求更低,其短小精悍的特点,尤其适用于移动互联网环境。
需要升级证书以支持ECC,那么环境上需要满足:
Nginx 1.11.0+ OpenSSL 1.0.2+
申请 ECC 证书这个环节不说了,请参考本站相关文章。取得ECC证书之后,按正常的证书配置方式配置上去,参考如下:
首先是将两个证书链都加入 Nginx 的配置文件:
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 信息放到同一目录,并做如下设置:
ssl_ct on; ssl_ct_static_scts /path/to/sct/dir;
这样 Nginx CT 模块会自动在这个目录下查找相应证书的 CT 信息并发送验证,另外也可以单独配置每个证书的 CT 文件:
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 命令可以验证:
openssl ciphers -V '你的 ssl_ciphers 套件信息' | column -t
通过执行命令检查,就可以看到加密套件配置中,椭圆曲线的套件队列情况,只要调整顺序(前置)就可以加大协商出支持椭圆曲线算法的套件的可能性。
我们贴一个示例下:
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';