09 用certbot/ACME自动配置SSL

今天在配置另一个网站时,无意间尝试了Let's Encrypt,才发现之前的SSL配置都走了弯路。实际上,SSL验证的本质是确保“网站”是“你”的,无论是采用文件验证,还是CNAME验证,都是为了证明这一点。

那么,其实只要证明“我可以操作服务器的命令行并具有超级管理员权限”就行了。certbot/ACME就是这样一个工具,它可以用几乎全自动的方式,在既有的HTTP网站基础上,验证权限,获取证书,下载证书,并可以自动修改Nginx配置文件。更方便的是,它还支持到期前自动更新SSL。

一、在Ubuntu上使用certbot

在Ubuntu 19以上版本,snap是默认安装的,因此我们可以直接安装certbot:

sudo snap install --classic certbot

注意,用snap安装前,要确保系统之前没有使用其他工具(例如apt、yum)安装过cerbot。如果安装过,可以先卸载掉之前的版本:

sudo apt remove certbot

用这行命令在/usr/bin目录下创建一个certbot命令的链接,以确保certbot命令可以在任何地方被执行:

sudo ln -s /snap/bin/certbot /usr/bin/certbot

接下来,如果nginx服务器上所有的网站都需要被自动配置,那么可以粗暴执行:

sudo certbot --nginx

一把头搞定所有网站。如果不放心,也可以仅通过certbot下载SSL证书:

sudo certbot certonly --nginx

如果nginx中已经配置了其他HTTPS网站,你仅希望利用certbot操作其中一个网站时,可以使用-d参数:

certbot --nginx -d abcde.com

这样一来就单独配置abcde.com了。

certbot会将自动生成的pem、key证书文件存到/etc/letsencrypt/live/<domain>下,并自动修改nginx配置文件,添加其中的ssl_certificate、ssl_certificate_key字段,同时还会贴心地配置好80端口的HTTP自动转HTTPS。凡是cerbot写入的行,它均会带上注释,非常清晰。

与此同时,certbot也在系统中利用cron或systemd创建了任务计划,可以在SSL证书到期前自动更新证书。

二、在Windows上使用Win-ACME

certbot也支持windows,但不直接支持IIS。可以在官网的windows页面查看详情。

在Windows+IIS环境下,可以使用Win-ACME工具,Github地址:https://github.com/win-acme/win-acme。下载它的win版本(当前最新版本是2.2.6:win-acme.v2.2.6.1571.x64.pluggable.zip),在服务器上解压缩。

确保你的网站已经按http-80端口方式配置,并且在IIS的网站绑定设置中,明确填入了主机名(一般为域名)。

直接运行它的可执行程序wacs.exe,根据提示,选择你要申请的http网站。它会弹出一个License,选择同意。输入邮箱地址以接收通知。之后一路确定即可。

返回到IIS,可以发现它自动添加了443绑定。删除80端口的绑定。查看系统的任务计划列表,发现增加了一个“win-acme renew”任务。

默认情况下,它会申请30天的SSL证书,并通过任务计划程序执行自动续期。

注意,如果将网站的80端口删除,将导致http-01挑战失败,导致续期失败。手动续期前,受限确保对应域名的80端口均已经添加。