暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

申请 Let's Encrypt 泛域名证书

左手代码 2020-03-06
811

Let's Encrypt 目前已经支持泛域名证书的申请了,就是申请一个证书,该域名下的所有子域名都可以共用该证书,非常方便。这里介绍通过 acme.sh
来部署签发证书,总共是分为 4 步骤:

  1. 安装 acme.sh

  2. 生成证书

  3. 复制证书到 nginx/apache 或者其他服务

  4. 更新证书

 

安装 acme.sh

安装过程很简单,只要一个命令即可,这个可以安装在服务器上面,也可以安装在本地的机器:

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

以上的命令主要是做了两件事情,一件就是把 ache.sh
安装到 home
目录里面,还有一件事就是创建一个定时任务来每天检测将要过期的证书,并且自动更新它。

这时候在你的家目录里面就会有一个 .acme.sh
的隐藏文件夹,里面就是 acme.sh
的相关文件,之后的所有修改都是在这里面执行的,不会有任何该文件夹外的其他操作。当然了,如果有需要也可以添加一条 bash 别名方便使用:

  1. alias acme.sh=~/.acme.sh/acme.sh

还会创建一个定时任务, 其中第一个分钟数是随机的(我这边是29):

  1. 29 0 * * * "~/.acme.sh"/acme.sh --cron --home "/home/vagrant/.acme.sh" > /dev/null

 

生成证书

acme.sh
实现了 acme
协议支持的所有验证方法. 一般有两种方式验证: http
dns
的验证,其中 dns
又分为自动验证和手动验证,推荐使用 dns
自动验证,最为方便快捷而且干净利落。

1. http 验证

  • http
     验证方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权, 类似微信公众号的验证形式,完成验证后,就可以生成证书了。

  1. acme.sh --issue -d mydomain.com -d *.mydomain.com --webroot /home/wwwroot/mydomain.com/

其中 -d
参数表示要验证的域名, --webroot
参数指定网站对应应用的根目录,

  • 假如你还没有部署任何的应用,那么也可以让 acme.sh
     伪装成自己是一个 webserver
     来:

  1. acme.sh --issue -d mydomain.com -d *.mydomain.com --standalone

  • 如果服务器上已经安装了 nginx
     服务,那么就可以不用指定应用目录, acme.sh
     会智能的从 nginx
     的配置中自动完成验证:

  1. acme.sh --issue -d mydomain.com -d *.mydomain.com --nginx

如果是 Apache
的话:

  1. acme.sh --issue -d mydomain.com -d *.mydomain.com --apache

注意, 无论是 apache
还是 nginx
模式, acme.sh
在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置.

该命令必须在服务器上运行,并且已经把域名解析到了对应的服务器 IP 上, 验证完成后会自动删除对于的验证文件

2. 手动 dns 方式

这种方式的好处就是无需服务器,无需公网 IP,只要能够操作域名解析即可;但是坏处就是 acme.sh
无法自动更新你的证书,每次到期后都要手动操作一遍。

  1. 生成对应的 TXT 解析记录

  1. acme.sh --issue --dns -d mydomain.com -d *.mydomain.com

这时候应该会有一个警告提示:

  1. vagrant@homestead:~/.acme.sh$ acme.sh --issue --dns -d mydomain.com

  2. [Fri Mar 6 09:35:44 UTC 2020] It seems that you are using dns manual mode. Read this link first: https://github.com/acmesh-official/acme.sh/wiki/dns-manual-mode

这个意思就是说通过手动 dns
生成的证书会无法自动更新,如果你的域名服务商支持 API
的话,建议您使用自动的。添加一个参数即可继续:

  1. acme.sh --issue --dns -d mydomain.com -d *.mydomain.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

这时候应该会有如下的提示:

  1. [Fri Mar 6 09:38:36 UTC 2020] Add the following TXT record:

  2. [Fri Mar 6 09:38:36 UTC 2020] Domain: '_acme-challenge.mydomain.com'

  3. [Fri Mar 6 09:38:36 UTC 2020] TXT value: 'nE0THUTez3qA6rvRj27IJyITkPqRnKihOrQIl1ibwhY'

复制其中的 TXT
记录,然后去对于的域名服务商创建该记录的解析,好了之后就可以来生成证书:

  1. acme.sh --renew -d mydomain.com -d *.mydomain.com

这时候你的证书就会在对应的文件夹里面 ~/.acme.sh/mydomain.com

生成证书后,对应的 TXT 解析记录就可以删除了

3. 自动 dns 方式(推荐)

自动 dns
相比于手动的,就是节省了去域名服务商配置解析的过程,通过域名服务商提供的解析 API
来自动创建解析记录,并且在签发证书后会自动删除对应的解析记录。

目前国内支持的 API 有阿里云、腾讯云等等 ,具体支持列表:https://github.com/acmesh-official/acme.sh/wiki/dnsapi

这里就以腾讯云(DNSPod.com)为例,介绍如何使用 API
来签发证书。由于是通过 API
签发证书,那么自然就需要访问的密钥对,可以去腾讯云控制台获取,然后把密钥导入到环境变量中:

  1. export DP_Id="1234"

  2. export DP_Key="sADDsdasdgdsf"

然后就可以签发证书,一切都是自动完成:

  1. acme.sh --issue --dns dns_dp -d mydomain.com -d *.mydomain.com

这时候你的证书就会在对应的文件夹里面 ~/.acme.sh/mydomain.com

签发完成后无需删除对应 TXT 的解析记录,因为已经自动删除了

 

安装/部署证书

到这里证书已经生成了,如果你是在本地机器生成的证书,要自己通过 scp
等复制到你想要的地方去;假如你是在服务器上生成的证书,那么 acme.sh
还可以帮你自动复制到对应的目录中:

  1. acme.sh --installcert -d mydomain.com \

  2. --key-file /etc/nginx/ssl/key.pem \

  3. --fullchain-file /etc/nginx/ssl/fullchain.cer \

  4. --reloadcmd "service nginx force-reload"

默认生成的证书都放在安装目录下 ~/.acme.sh/mydomain.com
, 请不要直接使用此目录下的文件; 这里面的文件都是内部使用, 而且目录结构可能会变化,一定要复制出去然后再使用

 

更新证书

假如你使用的是 http
或者自动 dns
方式生成的证书,那么 60 天后会自动更新证书,如果使用的是手动 dns
方式,那么到期后(90天)要自己手动再生成证书,流程和第一次生成时候的一样。

注:如果是在本地生成的证书,要自己复制到服务器上

 

更新 acme.sh

目前由于 acme
协议和 Let's Encrypt CA
都在频繁的更新, 因此 acme.sh
也经常更新以保持同步, 升级到最新版:

  1. acme.sh --upgrade

如果你不想手动升级, 可以开启自动升级:

  1. acme.sh --upgrade --auto-upgrade

你也可以随时关闭自动更新:

  1. acme.sh --upgrade --auto-upgrade 0


文章转载自左手代码,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论