新的域名终于备案通过了,但在服务器上安装宝塔面板并创建网站之后,却发现不知为何无法申请 Let's Encrypt 的免费 HTTPS 证书。只要我打开网站 SSL 配置中 Let's Encrypt 证书的申请界面,就会弹出 JSON 格式的报错信息。最后我手动用 Certbot
申请证书解决了这个问题,在此记录一下。
相关版本信息
云服务商:腾讯云
服务器系统:Ubuntu 20.04.3 LTS
宝塔面板:免费版 7.8.0
Nginx:1.20.1
Certbot:1.23.0
Snap:2.54
错误形式
只要我在宝塔面板中打开申请 Let's Encrypt 证书的界面,就会弹出 JSON 格式的报错信息:
{ "DvT0S_yhh1Y": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417", "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change", "meta": { "caaIdentities": [ "letsencrypt.org" ], "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf", "website": "https://letsencrypt.org" }, "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct", "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce", "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order", "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert" }
我在宝塔面板官方论坛寻觅一番后,基本没有发现遇到类似错误的用户,唯一一位同病相怜的用户在发帖后官方也没给出回答。看起来只好手动申请 Let's Encrypt 证书了。
使用 Certbot 申请 Let's Encrypt 证书
安装 Certbot
我首先进入 Let's Encrypt 的网站,看到 《快速入门》中推荐使用 Certbot
:
我们建议大多数具有命令行访问权限的人使用 Certbot ACME 客户端。它可以在不下线您的服务器的前提下自动执行证书颁发和安装。对于不需要自动配置的用户,Certbot 还提供专家模式。它易于使用,适用于许多操作系统,并且具有出色的文档。访问 Certbot 官网 以获取针对于操作系统和 Web 服务器的订制文档。
看起来挺不错,于是我进入了 Certbot 网站的 《Certbot Instructions》页面,选择好我的服务器软件(Nginx)和操作系统(Ubuntu 20)后,网站引导我安装一个叫 Snap
的包管理器。而我在进入 Snap
的安装指导页面后,发现上面写着 Ubuntu 20.04 LTS
已经预装了这个叫 Snap
的包管理器。然而,我的系统里并没有预装它……不知道是腾讯云的系统镜像里删掉了还是网站标错了。
于是需要用 apt 手动安装一下,查找 snapd
并安装即可:
sudo apt install snapd -y
安装成功后,需要先更新一下 snap
的源:
sudo snap install core; sudo snap refresh core
之后,按照官网上的说法,需要先卸载清理掉系统里被 apt
等 snap
之外的包管理器安装的 certbot
(如果之前被安装过),我之前没有安装过,就跳过清理这一步了。
然后,使用 snap
安装 certbot
:
sudo snap install --classic certbot
安装完成后,再设置符号链接,将 certbot
链接到/usr/bin
下方便调用:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
使用 Certbot 申请证书供宝塔面板使用
Certbot
是个全自动的工具,按照官网说法,如果使用 sudo certbot --nginx
就可以自动完成申请证书到写入 Nginx 配置文件的一条龙服务。不过我的 Nginx 配置文件和宝塔面板强相关,我还是打算只申请证书,不让 Certbot
自动修改我的 Nginx 配置文件了,免得它改出什么宝塔面板不兼容的 bug 来。
如果直接安装官方教程里的步骤,运行 sudo certbot certonly --nginx
会报错,因为宝塔面板的 Nginx 并不安装在默认路径下。所以运行时要额外注明一下 Nginx 的路径:
sudo certbot certonly --nginx --nginx-server-root=/www/server/nginx/conf/
之后,Certbot
会自动检测到宝塔面板中用 Nginx 创建的网站与其绑定的域名,选择好按回车即可。证书申请完成后,在终端中会给出生成的证书(PEM 格式)与密钥(KEY)两个文件的路径,将内容复制出来即可。
当我准备将证书粘贴到宝塔面板的「其他证书」中时,却惊讶的发现在「其他证书」中,已经自动读取到了刚才 Certbot
生成好的证书(图 1),只需要直接按保存按钮,即可完成配置。
保存后的证书也会出现在宝塔面板的证书夹中(图 2)。