acme.sh是个强大的脚本,可以自动申请、更新网站证书,有了它以后再也不需要为证书过期而发愁了。
本文展示如何在FreeBSD下使用acme.sh安装并更新证书。
acme.sh: 使用纯shell编写的基于ACME协议的证书安装、更新的跨平台脚本。
下载并安装acme.sh
首先,我们使用su
切换到root
。
acme.sh提供了几种下载方法,可以使用curl
,wget
或git
的方式。前两种方式未验证,使用方法官方指导如下:
$ curl https://get.acme.sh | sh -s email=my@example.com
或
$ wget -O - https://get.acme.sh | sh -s email=my@example.com
本文使用的git
方式进行安装:
$ git clone https://github.com/acmesh-official/acme.sh.git --depth=1
$ cd ./acme.sh
$ ./acme.sh --install -m my@example.com
此时将自动完成以下操作:
- 当前用户目录下创建
.acme.sh
文件夹,该文件夹中存放在acme.sh
相关文件,并且以后安装的证书文件将自动存在在~/.acme.sh
文件夹中. - 创建了一个全局命令:
acme.sh
,该命令指向~/.acme.sh/acme.sh
- 创建了一每天自动执行一次的定时任务(可以通过
crontab -e
查看)。
接着我们重新登录一下服务器,或是执行bash
重新初始化一下shell的环境,以使得acme.sh这个全局命令生效。
请求证书
在请求证书时,发放证书的机构需要验证我们是否为该域名的拥有者。所以在请求证书时,发放证书的机构会向我们提供的域名(默认为80端口)上请求一个指定的文件,如果这个文件存在且内容与预期相同,则认为用户(我们)拥有该域名。
所以在使用请求证书的命令前,首先需要保证请求域名的80端口在当前执行脚本的服务器上。当然了,如果我们的配置简单,acme.sh还能够自动读取apache或nginx等典型http服务的配置,并会为我们自动执行这一切,很遗憾笔者的环境并不是配置简单的环境,所以接下来展示如何手动请求。
acme.sh --issue -d example.com --webroot /root/of/web --debug
example.com
替换为你的域名/root/of/web
应该替换为你的域名(比如example.com
)对应站点的根目录
acme.sh
执行过程中,会先往/root/of/web
生成一个随机文件,比如为random.txt,然后在向http://example.com/random.txt
发起访问已获取到这个文件。所以证书请求成功的前提是上述两项配置正确。
--debug
debug可以更详细的查看到请求证书的过程,特别是在请求出错的时候。
--server证书服务商
acme提供了多种服务商供选择,所以在请求证书发生Timeout时,可以尝试换个服务商。比如acme默认的服务商是zerossl
,如果在的网络中请求证书时发生了timeout,则可以参考服务端列表切换为其它的服务端,比如:letsencrypt
使用方法为在请求时加入: --server letsencrypt
参数。
安装证书
证书成功请求后,便可以安装证书了,以笔者使用的nginx服务为例:
acme.sh --install-cert -d example.com \
--key-file /website/ssl-key/key.pem \
--fullchain-file /website/ssl-key/cert.pem \
--reloadcmd "nginx -s reload" --ecc
此时则会在/website/ssl-key
下生成私钥key.pem
及证书cert.pem
.
然后我们在nginx中指定上述私角及证书的位置即可。
此后,我们便坐等证书的自动更新吧。
总结
在操作时笔者遇到了小的问题,在这里强调一下:
- 安装完acme.sh后,需要重新初始化shell环境,否则在全局中找不到acme.sh。
- 在请求证书时,如果当前网站已经启用了证书,则必须保证证书处于有效状态,所以会导致请求随机文件时失败。解决的方法是临时禁用80向443的跳转。
- 在请求证书时,由于未知的原因,请求到的证书文件夹有_ecc(Elliptic Curve Cryptography(椭圆曲线密码学))后缀。所以我在安装证书时,加入了
--ecc
参数。
另:椭圆曲线密码学
挺有意思的,有时间的同学可以深入了解一下,在数字货币中也有它的身影。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。