acme.sh快速签发/续签 Let‘s Encrypt 证书

Let’s Encrypt的签发/续签虽说都是脚本自动化,但之前介绍的acme-tiny还是略显繁琐,而acme.sh相对来说就非常省心,自动化程度更高,大大缩短部署 Let’s Encrypt 证书的时间。

安装acme.sh

curl  https://get.acme.sh | sh

这样就已经安装好了acme.sh脚本,具体动作:

  1. 安装文件和配置文件都在home目录下,也就是 ~/.acme.sh/ 
  2. 创建一个bash alias, acme.sh=~/.acme.sh/acme.sh ,重新打开终端后直接输入 acme.sh 就可以快速方便地使用这个脚本
  3. 创建一个crontab定时任务,每天0点进行acme.sh脚本的续签证书,自动升级(可选)等任务

整个安装过程对环境无污染,所有新文件仅限 ~/.acme.sh/ 目录内。

acme.sh生成证书

acme.sh生成证书有两种方式,域名验证及http方式,在此处推荐使用http验证方式,在一台VPS上进行即可,无需额外的域名设置。

acme.sh  --issue  -d mydomain.com --webroot  /var/www/mydomain.com/

运行这个命令之后证书就已经签好,此处以我的域名www.guob.org为例,在 ~/.acme.sh/www.gubo.org/ 里可以找到所签发的证书,包括csr,key,完整链证书等,使用起来非常方便。

acme.sh安装证书

acme.sh安装证书也异常方便,除了apache自动安装之外,nginx的证书安装也是半自动的,自己只需修改nginx配置文件即可

# 此处以www.gubo.org为例,一定要修改为自己的域名
# 证书路径设置为/etc/nginx/ssl/,可自行设置为其它路径
acme.sh --installcert -d www.gubo.org \
--keypath  /etc/nginx/ssl/www.gubo.org.key  \
--fullchainpath /etc/nginx/ssl/www.gubo.org.fc.cer \
--reloadcmd  "service nginx reload"

这样证书就已经安装到位,比如此处的路径是在 /etc/nginx/ssl/ 路径下:

  • key文件为 /etc/nginx/ssl/www.gubo.org.key 
  • 完整链证书文件为 /etc/nginx/ssl/www.gubo.org.fc.cer 

更棒的是,acme.sh会自动记住证书安装的位置,以后自动续签之后会自动安装到相应位置并重启Nginx,不需要再手动添加crontab任务,写一大堆路径并记得重启Nginx。

和官方简略教程不同的是,我是用完整证书链进行安装的,以防一些机器(很有可能)没有 Let’s Encrypt 的根证书造成SSL不被信用的情况

修改Nginx配置文件启用ssl

这时需要修Nginx配置文件使得站点用上SSL证书,此处以我的域名www.gubo.org为例,我的配置文件是 /etc/nginx/conf.d/www.gubo.org.conf ,加上如下语句:

### Begin of SSL config
                ssl on;
                ssl_certificate /etc/nginx/ssl/www.gubo.org.fc.cer;
                ssl_certificate_key /etc/nginx/ssl/www.gubo.org.key;
                ssl_session_timeout 1d;
                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                ssl_prefer_server_ciphers on;
                ssl_ciphers                EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
                ssl_session_cache shared:SSL:50m;
                ssl_session_tickets      on;
                ssl_stapling      on;
                ssl_stapling_verify      on;
                resolver                 114.114.114.114 valid=300s;
                resolver_timeout         10s;
### End of SSL config

然后测试配置文件并重启nginx即可:

nginx -t && service nginx restart

acme.sh全自动续签证书

目前 Let’s Encrypt 证书的有效期是90天,官方推荐的方式是脚本自动化续签。acme.sh的实现方式是#全自动#,对,你不用进行任何设置,acme.sh会自动在80天后续签,一个键都不用敲!

acme.sh自动更新自身

Let’s Encrypt 一直处于高速发展的状态,每隔一段时间都会添加新的特性,而acme.sh也会随着官方不断更新,所以保持acme.sh更新是很有必要的,而acme.sh也提供了自动升级的功能:

  1. 手动升级:
    acme.sh --upgrade
  2. 自动升级:
    acme.sh  --upgrade  --auto-upgrade
  3. 关闭自动升级:
    acme.sh --upgrade  --auto-upgrade  0

参考资料

  1. 官方简略教程:https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E
  2. Let’s Encrypt证书快速申请并自动续期:https://www.gubo.org/lets-encrypt-quick-start-and-auto-renew/
  3. Mozilla SSL配置生成器:https://mozilla.github.io/server-side-tls/ssl-config-generator/

天毅

Linux/php菜鸟,喜欢修修补补,喜欢分享,喜欢写博客,其实主要是喜欢找速度快的国外空间(剁手癌晚期,买VPS完全停不下来)...

3 thoughts to “acme.sh快速签发/续签 Let‘s Encrypt 证书”

  1. example.com 和 www.example.com 需要分别单独签吗?

    http的www和裸域名都能跳转到https://example.com,但是https://www.example.com怎么301到https://example.com呢?

    1. 不需要单独签,同时都指向一个目录(都能访问到同一个目录)就行,签发的时候用命令:
      acme.sh –issue -d example.com -d www.example.com –webroot /var/www/example.com/

      再写一个脚本配置即可(没有实测):
      if ($host != ‘example.com’ ) {
      rewrite ^/(.*)$ https://example.com/$1 permanent;
      }

发表评论

电子邮件地址不会被公开。 必填项已用*标注