使用 acmetool 轻松获取 Let’s encrypt 签名(HTTPS)

Let’s Encrypt 官方提供的 ACME 客户端 Certbot 过于笨重了,安装过程非常繁琐,如果从源码安装竟然还要求服务器有512MB以上的内存,说是为了编译依赖。这对于只有部署了一个小网站的云服务器根本就是杀鸡用牛刀。而且 ACME 自带各种黑魔法来修改 web 服务器的配置,出发点是好的,但技术人员喜欢掌控一切的感觉,因为没人有喜欢在出bug的时候找不到头绪。

于是 gtt 偶遇一款轻量级 ACME 客户端 acmetool,作者 Hugo Landau,使用 go 语言开发,二进制文件下载后即可使用;获取签名过程简短快捷,没有任何黑魔法,非常符合 gtt 口味。

Acmetool is intended to be “magic-free”, unlike the official Let’s Encrypt client, this doesn’t modify your web server configuration.

理解协议

acme协议的核心就是你需要向 acme 服务器证明这个域名下的服务器是完全由你控制的。如何证明?一种办法是你和 acme 服务约定好,他访问你一个特定的 URI,比如 https://www.gaott.info/.well-known/acme-challenge/llf4uhyuXY64bnVjncYRCEdw5TjRdnHYfY33o05Qs68,只要文件内容和双方约定的一致,则验证通过,ACME 给你签名。当然完整的协议过程复杂很多,这里这是简单的理解。

acmetool 使用方法

安装

到 github 上的 release 里找一个版本:https://github.com/hlandau/acme/releases ,下载到本地,解压并放到 /usr/local/bin/ 目录下。

wget https://github.com/hlandau/acme/releases/download/v0.0.59/acmetool-v0.0.59-linux_amd64.tar.gz
tar xzf acmetool-v0.0.59-linux_amd64.tar.gz
sudo cp acmetool-v0.0.59-linux_amd64/bin/acmetoo /usr/local/bin/

配置 nginx

acmetool 需要把挑战的内容写到 .well-known 目录下供 Let’s Encrypt 验证,所以先把 .well-known 目录的访问权限打开

    location ~ /\.well-known {
        allow all;
    }

获取签名

sudo acmetool quickstart

按照提示做出选择,

第一步选择:

Let's Encrypt (Live) - I want live certificates

第二步,选择将挑战放在目录中,即通过访问静态文件的方式验证,还有其他好几种方式,都有详细的解释,这里 gtt 选择 WEBROOT

WEBROOT - Place challenges in a directory

第三步:
输入.well-known/acme-challenge的路径,比如网站的路径是/var/www,那么这里请输入/var/www/.well-known/acme-challenge。如果目录不存 acmetool 会自动创建。

第四部:开始认证

acmetool want www.gaott.info

等待一段时间,如果顺利的话,在路径 /var/lib/acme/live/ 下会自动创建一个目录:www.gaott.info

/var/lib/acme/live/www.gaott.info/
├── cert
├── chain
├── fullchain
├── privkey
└── url

privkey 是私钥,fullchain是完整的证书链,可以直接配置在nginx中。

更新 nginx ssl 配置

配置两个端口80和443,并且配置访问 80 后跳转到 443 端口。修改配置后reload nginx 生效。

server {
    listen 80;
    server_name www.gaott.info;   
    rewrite ^ https://$http_host$request_uri? permanent;
} 

server {
    server_name www.gaott.info;   
    listen 443 ssl;
    ....

    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    ssl_certificate /var/lib/acme/live/s.gaott.info/fullchain;
    ssl_certificate_key /var/lib/acme/live/s.gaott.info/privkey;
        ...
} 

创建 cron 定时更新任务

Let’s Encrypt 签的证书有效期都是3个月,所以需要创建一个定时任务自动更新证书:

cat /etc/cron.d/acmetool

SHELL=/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
MAILTO=root
0 5 * * * root /usr/local/bin/acmetool --batch reconcile
5 5 * * * root service nginx reload

Happy https!

发表评论

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