Skip to main content

生成、签署 ECC 证书,Apache Httpd 部署双证书教程

Dec 27, 2016
生成、签署 ECC 证书,Apache Httpd 部署双证书教程

前言

2017年绝对是移动互联网的加密元年,越来越多的移动互联网网站、应用会部署 HTTPS 加密,不过移动平台因为普遍基于 ARM 架构所以对处理 HTTPS 的性能和速度都不如电脑平台。 因此我们就需要部署更短、更快和更安全的 ECC 证书来实现移动平台的 HTTPS 的加密解密高效化。

介绍

椭圆曲线密码学(Elliptic curve cryptography,缩写为ECC),一种建立公开密钥加密的算法,基于椭圆曲线数学,其更适合于移动互联网,有更好的安全性和更好的性能。ECC加密算法 1985年 提出,到 2005 年才在各种操作系统中获得广泛支持,2015 年开始被普遍性的部署。 缺陷: 就像上面所说的一样,2005 年才被各大操作系统广泛支持,所以 2005 之前包括之后几年发布的操作系统都不会对其有很好的支持。 因此会需要使用本文介绍的双证书来解决。

签发

目前主流的 CA 都已经支持了 ECC 证书的签发,但是几个老牌大厂支持 ECC 的证书动辄就是几千元,那还玩个蛋。 目前廉价或免费的 ECC 证书解决方案:

  1. Comodo 的低端证书(四级证书链接,略长)
  2. Let's Encrypt 的免费证书(90天签发一次,签发略复杂)

CSR 申请方法

一、生成 key

openssl ecparam -genkey -name secp256r1 -out mf8.biz-ecc.key

-name 参数 prime256v1 或者secp384r1。 256bit 其实安全性和速度都足够了.

二、生成 CSR

openssl req -new -sha256 -key vobe-io-ecc.key -out vobe-io-ecc.csr 在这里我们只需要 sha256 即可,这里之后会提问你很多问题,可以搜索一下 csr 的填写教程。

三、傻瓜

一键命令: openssl ecparam -out 你的域名.ecc.pkey -name secp256r1 -genkey && openssl req -new -key 你的域名.ecc.pkey -sha256 -nodes -out 你的域名.ecc.csr -subj “/C=CN/ST=省份/L=城市/O=组织/OU=组织单位/部门/分支/CN=你的域名” 将中文部分修改补齐即可,默认生成 256 bit 的 key 和 csr 。 在线生成: https://www.chinassl.net/ssltools/generator-csr.html

Let's Encrypt 方法

这里介绍用 acme.sh 签发,米饭也是用这货签的。 指定 --keylength ec-256 就可以将证书类型改为 ECC:

acme.sh --issue -w /data/wwwroot/www.mf8.biz -d mf8.biz -d www.mf8.biz --keylength ec-256

Apache Httpd 双证书

Nginx 教程:https://bbs.mf8.biz/ecc-nginx-double-cert/ Apache Httpd 版本: 2.4(2.2 我测试不成功),然后 OpenSSL 库的版本不同,方法也不同。

OpenSSL 1.0.2 or Later

适用于: Ubuntu 16.04 、Debian 9 or 8 + BackPorts 等系统 OpenSSL 版本较高的系统 这里就会非常简单,只要复制两份即可,然后必须将证书和证书链合并为一个文件(证书上,证书链下)。

#ECC 在前
SSLCertificateFile "/usr/local/httpd/conf/ssl/www.mf8.biz.ecc.crt"
SSLCertificateKeyFile "/usr/local/httpd/conf/ssl/www.mf8.biz.ecc.key"
#RSA 在后
SSLCertificateFile "/usr/local/httpd/conf/ssl/www.mf8.biz.crt"
SSLCertificateKeyFile "/usr/local/httpd/conf/ssl/www.mf8.biz.key"

OpenSSL < 1.0.2

适用于: Centos 7 Ubuntu 14.04 等系统 OpenSSL 版本小于 1.0.2 的,需要将 ECC 和 RSA的证书链合并,ECC 在前,RSA 在后。

#ECC 在前
SSLCertificateFile "/usr/local/httpd/conf/ssl/www.mf8.biz.ecc.crt"
SSLCertificateKeyFile "/usr/local/httpd/conf/ssl/www.mf8.biz.ecc.key"
#RSA 在后
SSLCertificateFile "/usr/local/httpd/conf/ssl/www.mf8.biz.crt"
SSLCertificateKeyFile "/usr/local/httpd/conf/ssl/www.mf8.biz.key"
#合并的证书链
SSLcertificateChainFile "/usr/local/httpd/conf/ssl/ca.crt"

Cipher Suites

然后不管 OpenSSL 版本,Cipher Suites 都要搞好,不然双证书是不会生效的。

SSLCipherSuite: 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;

效果图