之前的数字证书都是使用RSA的,现在有新的一种签名算法:ECDSA,使用ECDSA算法签名的数字证书也叫做ECC证书。
ECC证书的好处
使用ECC证书中有用户公钥,相比于之前RSA证书而言,256位ECC key就能起到相当于3072位的RSA key的安全性。另外一点就是ECC的运算速度相对以同等安全性的RSA的速度要快上很多,这样就可以减少服务器的资源开销,并且ECC证书证书文件会比RSA证书文件要小上很多。
现在Let’s Encrypt的兼容性也挺高的,Let’s Encrypt 由 ISRG(Internet Security Research Group,互联网安全研究小组)提供了免费、自动化、开放的证书签发服务,虽然证书只有 90 天有效期,但可以通过定时脚本更新,目前acme.sh项目挺方便的,它是一个实现 ACME 协议的客户端,能够向支持 ACME 协议的 CA 申请证书(如 Letsencrypt)。 最重要的是它对接了大多数的域名服务商,能够通过域名服务商提供的 API,自动的添加 DNS 验证记录进行全自动颁发证书,还可以模拟 HTTP 服务器进行文件验证。so,不管你的证书期限是 90 天,还是更短,再也不用担心证书过期的问题了。
至于 ACME 协议是什么?Automatic Certificate Management Environment 自动化证书管理环境,通过它我们可以实现证书的自动申请以及部署,可以大大的节省人员的管理及额外的配置工作。
好了,废话不多说。
安装 acme.sh
acme.sh 下载非常的简单,官方提供了 2 中方式:
- 通过执行在线脚本安装:
- 通过 git 安装:
$ curl https://get.acme.sh | sh
# 或者
$ wget -O - https://get.acme.sh | sh
git clone https://github.com/Neilpang/acme.sh.git
cd ./acme.sh
./acme.sh --install
在安装的过程中,做了 3 件事:
acme.sh=~/.acme.sh/acme.sh
0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null
使用 acme.sh
如何使用?acme.sh 的功能非常的强大,使用方式确非常的简单。提醒,该脚本需要在你的服务器下执行。官方地址:How to issue a cert。
关于 ECC 证书,你只需要再末尾添加 –keylength ec-256。如:
$ acme.sh --issue -w /home/wwwroot/example.com -d example.com -d www.example.com --keylength ec-256
可选长度有:
ec-256 (prime256v1, “ECDSA P-256”) ec-384 (secp384r1, “ECDSA P-384”) ec-521 (secp521r1, “ECDSA P-521”, which is not supported by Let’s Encrypt yet.)
具体的大家可以参考上面的官方说明
申请通配符证书
首先我们需要确认你使用的是什么DNS服务商,只有在DNSapi上的才支持添加通配符证书。
我们已CloudFlare为例
#首先在CloudFlare后台把CF key复制出来使用以下命令导入到系统
export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Email="xxxx@sss.com"
#然后就可以用以下命令申请证书,全程DNS自动验证
acme.sh --issue --dns dns_cf -d example.com -d *.example.com
本人使用以下命令生成证书
#生成RSA证书
acme.sh --issue -d example.com -d *.example.com --dns dns_cf --dnssleep 30 --ocsp
#生成ECC证书
acme.sh --issue -d example.com -d *.example.com --dns dns_cf --dnssleep 30 --keylength ec-384 --ocsp
安装证书
再颁发证书之后,我们可能需要将证书拷贝到指定位置。那么我们需要使用到 –install-cert 命令,请尽量避免手动拷贝证书。
# Apache RSA
$ acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"
# Nginx RSA
$ acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"
# Apache ECC
$ acme.sh --install-cert -d example.com --ecc \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"
# Nginx ECC
$ acme.sh --install-cert -d example.com --ecc \
--key-file /path/to/keyfile/in/nginx_ecc/key.pem \
--fullchain-file /path/to/fullchain/nginx_ecc/cert.pem \
--reloadcmd "service nginx force-reload"
这里会将私钥、证书、证书链拷贝到指定位置,成功后执行 –reloadcmd 命令。请确保有执行这些命令的权限。
当然你也不用担心证书更新的问题,在证书 60 天之后,会自动更新,更新后就会执行 –reloadcmd 的命令。
这里还有一些 hook 功能,请查看帮助 $ acme.sh -h,如,–renew-hook(每次证书成功更新后执行的命令)等。
更新证书
使用该工具的应该都是冲着其强大的自动更新部署功能来的。当然,如果你想手动更新:
# RSA
acme.sh --renew -d example.com --force
# ECC
acme.sh --renew -d example.com --force --ecc
如何部署双证书
因为我使用的是Nginx,所以这里就只讲Nginx的部署。
重要提示:Nginx只有在版本1.11以后(包括1.11)才支持部署双证书,所以版本不够的同学需要先升级Nginx,可以使用nginx -V查看。
准备好RSA和ECC两套证书和私钥文件,然后在配置文件中添加:
# ecc certificate
ssl_certificate /path/to/fullchain/nginx_ecc/cert.pem;
ssl_certificate_key /path/to/keyfile/in/nginx_ecc/key.pem;
# rsa certificate
ssl_certificate /path/to/fullchain/nginx/cert.pem;
ssl_certificate_key /path/to/keyfile/in/nginx/key.pem;
ssl_ciphers ECDSA:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES256:RSA+AES128:RSA+AES256:!NULL:!aNULL:!MD5:!ADH:!DH:!RC4:!DES;
ssl_prefer_server_ciphers on;
有一点需要注意,如果希望默认使用ECC证书需要把ECDSA套件添加在前面,例如ECDHE_ECDSA的套件放在前面,如果不这样做的话,配置的加密套件最优先的RSA加密套件,那么会默认使用RSA的证书。当这些完成后,就可以使用ssllabs或者myssl去检测一下双证书的部署状况了。