在 Nginx 中配置 ECC+RSA 双证书

为何会出现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';
相关推荐:
Nginx安装后默认直接显示自身的版本号,出于安全或隐私的考虑,可能需要隐藏Nginx的版本信息。隐藏Nginx的版本信息非常简单,只需要适当修改几个文件即可实现,且不会对正在运行中的程序造成影响。 1、修改 …
椭圆曲线加密算法简介:椭圆曲线密码学(Elliptic curve cryptography,缩写为ECC),一种建立公开金钥加密的算法,基于椭圆曲线数学。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分 …
一般来说,主流的Web服务软件,通常都基于两种基础密码库:OpenSSL和Java。 Tomcat、Weblogic、JBoss等,使用Java提供的密码库。通过Java的Keytool工具,生成Java Keystore(JKS)格式的证书文件。 Apache …
在申请数字证书之前,您必须先生成证书私钥和证书请求文件(CSR,Cerificate Signing Request),CSR是您的公钥证书原始文件,包含了您的服务器信息和您的单位信息,需要提交给CA认证中心。 在生成CSR文件时会 …
App Transport Security(应用程序安全传输),简称ATS,是苹果在iOS 9 中首次推出的一项隐私安全保护功能,启用ATS后,它会屏蔽明文HTTP资源加载,强制App通过HTTPS连接网络服务,通过传输加密保障用户数 …
拿起手机扫一扫即可带走我!