chaihongjun.me

acme协议脚本安装Let'sEncrypt免费通配符域名证书

还记得之前写过了一篇文章《服务器使用certbot安装SSl证书》,那篇文章介绍的是使用certbot客户端程序来安装免费的证书,整个过程操作其实算不上繁琐,但是需要自己去打理的东西挺多的,比如续订证书文件的脚本等。而且,对于有很多的域名有点不方便使用(执行命令要输入很长),如果要增加新的域名,还得重新走一遍更新过程(输入很长的执行命令),只是执行续订脚本无法对新域名起作用。这里结合acme.sh这个脚本以及如何去申请域名通配符的方法真正做到了一劳永逸:再新增域名网站的时候,只要改造一下nginx的配置就可以,无需再去执行申请脚本的动作。

环境介绍:

server os:aliyun centos

dns parsing service provider: dnspod

 

操作过程如下:(以下操作过程建议在root下执行)

1.下载脚本并执行安装

wget -O - https://get.acme.sh | sh

此时会执行一些东西,在/root/目录下会创建.acme.sh目录,并且生成一些文件,相当于在服务器上安装了一个客户端

安装acme.sh

并且,这个时候在系统的cron里面会添加一个命令,定时更新证书用的:

acme.sh定期执行更新命令

所以这个脚本程序比较人性化的一点体现出来了。

2.接着去dnspod申请API并保存

登录dnspod后台,进入菜单--【用户中心】--【安全设置】,点击右侧的"创建API Token",这里名称随意命名即可。

创建dnspodAPIToken

注意提示信息:仅仅在创建的时候显示一次,所以,如果怕忘记或者在执行本篇文章介绍的过程中出错,建议把ID和token记录下来,比如记事本之类。

3.正式进入申请证书的整个流程的准备环节,在shell环境下分别输入:

export DP_Id="62100"
export DP_Key="f4d4b2a300fb1b92b32e8d13e7ddb777"

配置dnspodAPIToken

这里 id  和 token 请换成你申请的值

4.开始申请签发证书

 ./acme.sh --issue --dns dns_dp -d chaihongjun.me -d *.chaihongjun.me --debug --ocsp

-d 指代域名,可以有多个 -d 参数,所以,后面又跟了一个通配符域名,以上域名请换成你所需要的。整个命令执行需要一段时间,最后会有一个120秒的等待。等最后出现success字样,就表示签发成功了。签发成功之后会在/root/.acme.sh/生成一个目录,这个目录的名称就是你申请的域名:

执行脚本生成的目录结构

这个目录下就有申请的证书文件和密钥文件:

免费证书及密钥

既然已经签发成功了,之前去改nginx配置即可,引用这个目录下的文件就好了。打住!官网有一段说明很重要(https://github.com/Neilpang/acme.sh/wiki/说明)

注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.

正确的使用方法是使用 --installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 

这就牵出了后面的证书安装过程(其实是复制证书文件到其他地方,通过它给的installcert命令可以保证可以自动更新升级,如果是我们手动cp,则无法后续的续订证书)

5.安装证书(复制证书)

./acme.sh  --installcert -d chaihongjun.me  -d *.chaihongjun.me   
        --cert-file   /etc/letsencrypt/acme/chaihongjun.me.cer
        --key-file   /etc/letsencrypt/acme/chaihongjun.me.key 
        --ca-file       /etc/letsencrypt/acme/ca.cer 
        --fullchain-file /etc/letsencrypt/acme/fullchain.cer 
        --reloadcmd  "service nginx force-reload"

以上命令是把对应域名的证书文件都丢到/etc/letsencrypt/acme/里面去了,并且让nginx重新加载配置。

6.最后一个步骤是配置nginx

需要注意的是有这几个配置,除了密钥,其他引入的都是fullchain:

ssl_trusted_certificate  /etc/letsencrypt/acme/fullchain.cer;
ssl_certificate   /etc/letsencrypt/acme/fullchain.cer;
ssl_certificate_key /etc/letsencrypt/acme/chaihongjun.me.key;

然后如果使用了pagespeed,则这两个很重要:

pagespeed SslCertDirectory /etc/letsencrypt/acme;
pagespeed SslCertFile /etc/letsencrypt/acme/fullchain.cer;

至此,整个安装配置过程都完成了,然后就可以撒手不管它自动续期(60天周期)

 

关于其他内容:

  1. 证书会60天周期自动更新续订

  2. acme.sh本身也要更新的,可以手动 ./acme.sh --upgrade 到最新版,也可以自动升级 ./acme.sh  --upgrade  --auto-upgrade,以及关闭 ./acme.sh --upgrade --auto-upgrade 0

  3. 详情请见官网 https://github.com/Neilpang/acme.sh/
     

注意:
如果第一个步骤就提示下载失败error之类的,那么请确认系统是centos6.5版本,如果是这样的情况,有两种解决方案:
1. 执行curl命令的时候指定 tsl版本  curl --tlsv1 https://get.acme.sh | sh
2. 将 get.acme.sh 内容下载并添加参数  --no-check-certificate

#!/usr/bin/env sh
#https://github.com/Neilpang/get.acme.sh

_exists() {
  cmd="$1"
  if [ -z "$cmd" ] ; then
    echo "Usage: _exists cmd"
    return 1
  fi
  if type command >/dev/null 2>&1 ; then
    command -v $cmd >/dev/null 2>&1
  else
    type $cmd >/dev/null 2>&1
  fi
  ret="$?"
  return $ret
}

if _exists curl && [ "${ACME_USE_WGET:-0}" = "0" ]; then
  curl https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh | INSTALLONLINE=1  sh
elif _exists wget ; then
  wget --no-check-certificate  -O -  https://raw.githubusercontent.com/Neilpang/acme.sh/master/acme.sh | INSTALLONLINE=1  sh
 else
  echo "Sorry, you must have curl or wget installed first."
  echo "Please install either of them and try again."
fi

如果上述方法均不可行,可以参照 https://github.com/Neilpang/acme.sh/issues/1439 贴出的方法,手动安装

知识共享许可协议本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。作者:柴宏俊»

相关推荐