使用acme.sh申请Let's Encrypt的EC证书

此文章来自我的博客,发表于2017年3月7日。据了解,其所介绍之内容如今[2017年11月8日]仍可使用

鉴于信息技术类文章迁移计划,将其移动至此。

acme.sh是一个国人编写的、基于ACME协议的第三方Let's Encrypt证书管理工具.使用它申请EC证书较为简单.

#下载acme.sh
apt update&&apt install git
git clone https://github.com/Neilpang/acme.sh.git
cd ./acme.sh/
1.使用Webroot模式签发证书
./acme.sh --issue -d hardrain980.com -d www.hardrain980.com -w /var/www/hardrain980.com -k ec-256
  1. 此方法依赖于运行中的http服务器(e.g. Apache httpd/Nginx),运行脚本前不要停止http服务器.
  2. Web根目录要对你当前登陆ssh的用户可写,因为acme.sh要在-w指定的目录下创建.well-known/文件夹并在其中创建文件,以验证域名所有权
  3. 可以通过多个-d指定多个域名,签发多域名证书
  4. ★重要:如使用此方法签发多域名证书,上一条所述的多域名在http服务器的vHost中必须设置***相同的Web根目录***,且为-w所指定的路径.一般而言,如同时签发domain.tld和www.domain.tld时可以这样做;而domain.tld和mail.domain.tld则不能,因为其不在同一个vHost下。

2.使用Standalone模式签发证书
#安装acme.sh的standalone模式所依赖的netcat
apt update&&apt install netcat
#停止http服务器
/etc/init.d/apache2 stop
/etc/init.d/nginx stop
#使用acme.sh的standalone模式签发证书
./acme.sh --issue --standalone -d hardrain980.com -d www.hardrain980.com -d old.hardrain980.com -d gr.hr98.xyz -d generate204.com -k ec-256
  1. 对于单域名或多个Web目录相同的域名也可这样签发证书.
  2. 运行前务必停止[包括但不限于http服务器]的任何监听80端口的服务;如不确定80端口是否被占用,可使用netstat -lp|grep 80查看.
  3. 无需使用-w指定Web根目录.
  4. 所有由-d指定的多域名都需要解析到运行acme.sh的主机.

另注:-k能指定的所有公钥类型:

  1. -k {2048|3072|4096} 使用2048/3072/4096位的RSA密钥对.
  2. -k {ec-256|ec-384} 使用256/384位的EC密钥对.

3.使用EC证书
Apache
<VirtualHost *:443>
...
#EC证书和公钥在前,RSA证书和公钥在后.
SSLCertificateFile /root/.acme.sh/hardrain980.com_ecc/fullchain.cer
SSLCertificateKeyFile /root/.acme.sh/hardrain980.com_ecc/hardrain980.com.key
SSLCertificateFile /etc/letsencrypt/live/hardrain980.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/hardrain980.com/privkey.pem
...
</VirtualHost *:443>
Nginx
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name domain.tld www.domain.tld;
...
#EC证书在前,RSA证书在后
ssl_certificate /root/.acme.sh/domain.tld_ecc/fullchain.cer;
ssl_certificate_key /root/.acme.sh/domain.tld_ecc/domain.tld.key;
ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem;
...
}

如果使用低于1.1.0版本的OpenSSL,还需要修改加密套件顺序,而不能简单使用HIGH:!aNULL,因为这些版本中,使用相同加密算法的加密套件按照密钥交换算法来排序,默认顺序是ECDHE-RSA,ECDHE-ECDSA,DHE-RSA,DHE-DSS,RSA。因此需要手动设置加密套件顺序。

可以使用如下顺序:

CHACHA20:AESGCM:AES:+ECDHE-ECDSA:+ECDHE-RSA:+DHE-RSA:+DHE-DSS:+kRSA:!aNULL

1.1.0以上版本的OpenSSL无此问题。

重载http服务器

/etc/init.d/apache2 restart
/etc/init.d/nginx restart