ECC+RSA双证书解决方案

  什么是ECC

  ECC是Elliptic Curves Cryptography的缩写,意为椭圆曲线密码编码学。和RSA算法一样,ECC算法也属于公开密钥算法。最初由Koblitz和Miller两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性。

  ECC算法的数学理论非常深奥和复杂,在工程应用中比较难于实现,但它的单位安全强度相对较高,它的破译或求解难度基本上是指数级的,黑客很难用通常使用的暴力破解的方法来破解。RSA算法的特点之一是数学原理相对简单,在工程应用中比较易于实现,但它的单位安全强度相对较低。因此,ECC算法的可以用较少的计算能力提供比RSA加密算法更高的安全强度,有效地解决了“提高安全强度必须增加密钥长度”的工程实现问题。

  与RSA算法相比,ECC算法拥有突出优势:

  1、更适合于移动互联网: ECC加密算法的密钥长度很短(256位),意味着占用更少的存储空间,更低的CPU开销和占用更少的带宽。随着越来越多的用户使用移动设备来完成各种网上活动,ECC加密算法为移动互联网安全提供更好的客户体验。

  2、更好的安全性:ECC加密算法提供更强的保护,比目前的其他加密算法能更好的防止攻击,使你的网站和基础设施比用传统的加密方法更安全,为移动互联网安全提供更好的保障。

  3、更好的性能: ECC加密算法需要较短的密钥长度来提供更好的安全,例如,256位的ECC密钥加密强度等同于3072位RSA密钥的水平(目前普通使用的RSA密钥长度是2048位)。其结果是你以更低的计算能力代价得到了更高的安全性。经国外有关权威机构测试,在Apache和IIS服务器采用ECC算法,Web服务器响应时间比RSA快十几倍。

  4、更大的IT投资回报:ECC可帮助保护您的基础设施的投资,提供更高的安全性,并快速处理爆炸增长的移动设备的安全连接。 ECC的密钥长度增加速度比其他的加密方法都慢(一般按128位增长,而 RSA则是倍数增长,如:1024 -2048--4096),将延长您现有硬件的使用寿命,让您的投资带来更大的回报。

  ECC加密算法的通用性不断增强

  ECC加密算法自1985年提出,因其工程应用中难度较高,到2005年才在各种操作系统中获得广泛支持,在全球安全市场需求的刺激下,ECC算法将逐步取代RSA算法,成为主流加密算法。目前,全球各大CA都已经陆续开始为用户签发采用ECC加密算法的各种证书.ECC加密算法以后支持所有操作系统、所有浏览器和各种移动终端,主要有:

  Mozilla NSS 3.11以上版本支持

  OpenSSL 1.0以上版本支持

  微软CryptoAPI Vista/Win7/Win8都支持

  BouncyCastle 1.32以上版本支持

  JSSE 6 以上版本支持

  BSAFE 4.0 以上版本支持

  各种版本的IE浏览器、火狐浏览器、谷歌浏览器和苹果浏览器都支持

  安卓系统(2.3以上版本)、苹果IOS(5.0以上版本)、Window Phone(各种版本)都支持

  Apache配置方法

  首先将 ecc 证书和 rsa 证书的证书链合并, ecc 证书链在前, rsa在后, cat chain-ecc.crt chain-rsa.crt > chain-ecc-rsa.crt 打开apache安装目录下conf/extra目录中的httpd-ssl.conf(或conf目录中的ssl.conf)文件

  在配置文件中的 …… 之间添加或编辑如下配置项

  SSLProtocol all -SSLv2 -SSLv3

  SSLHonorCipherOrder on

  SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM

  #ECC 将 ecc 证书(不含证书链)和 ecc 证书的密钥文件放在前

  SSLCertificateFile /etc/apache2/SSL2015/ecdsa.cert.crt

  SSLCertificateKeyFile /etc/SSL2015/certs/ecdsa.key

  #RSA 将 rsa 证书(不含证书链)和 rsa 证书的密钥文件放在后

  SSLCertificateFile /etc/apache2/SSL2015/rsa.cert.crt

  SSLCertificateKeyFile /etc/apache2/SSL2015/rsa.cert.key

  #指定 ecc/rsa 合并后的证书链位置

  SSLcertificateChainFile /etc/apache2/SSL2015/chain-ecc-rsa.crt

  如果服务器的 OpenSSL 版本已经为 1.0.2 以及更新的版本,则用以下方法,ecc 和 rsa 证书要包含证书链:

  #ECC 指定 ecc 证书文件位置(证书以及证书链合并为一个文件为 ecdsa.cert.pem )

  SSLCertificateFile /etc/apache2/SSL2015/ecdsa.cert.pem

  SSLCertificateKeyFile /etc/SSL2015/certs/ecdsa.key

  #RSA 指定 rsa 证书文件位置(证书以及证书链合并为一个文件为 rsa.cert.pem )

  SSLCertificateFile /etc/apache2/SSL2015/rsa.cert.pem

  SSLCertificateKeyFile /etc/apache2/SSL2015/rsa.cert.key

  以上是指定证书的方式,各位根据 OpenSSL 的版本选择对应的方式,当然这还没完,下一步要直接指定证书加密方式,确保 ecc 的加密方式要在 rsa 模式的前面,否则 ecc 证书没法生效了。

  Nginx配置方法

  nginx 最新的 mainline 版本已经支持了双证书,推荐使用nginx 1.11.1版本,openssl 版本推荐使用1.0.2h版本。

  修改nginx的配置文件 nginx.conf 配置双证书:

  ssl_certificate ssl/ecc/server.pem;

  ssl_certificate_key ssl/ecc/server.key;

  ssl_certificate ssl/rsa/server.pem;

  ssl_certificate_key ssl/rsa/server.key;

  ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;

  ssl_prefer_server_ciphers on;

  ssl_stapling on;

  ssl_stapling_verify on;

  ssl_session_cache shared:SSL:10m;

  ssl_session_timeout 10m;

  add_header Strict-Transport-Security "max-age=31536000";

  error_page 497 https://$host$request_uri;