前言
最近把一台阿里云的服务器从默认的宝塔 Linux 面板重置为了 Ubuntu 系统,需要重新安装一些应用。原先在这台服务器搭建的 OpenList 是使用宝塔面板申请的 IP 证书,现在没有宝塔了就想研究并记录一下如何通过别的方式申请 IP 证书。
Let’s Encrypt 从 2025 年开始支持申请 IP 证书,一开始想的是通过 Certbot 直接申请 IP 证书,但是没想到这个官方推荐的工具还不支持:Requested name 1.2.3.4 is an IP address. The Let's Encrypt certificate authority will not issue certificates for a bare IP address.
查阅资料后发现 acme.sh 已经支持申请 IP 证书了,开始折腾!
在开始之前,请确保你已经:
- VPS 开放了 80 端口。
- VPS 安装了 Nginx。
安装 acme.sh
安装命令为:
curl https://get.acme.sh | sh -s email=my@example.comNOTEemail 需要改成你自己的邮箱,用于向 CA 注册使用。
安装完成后会自动将 acme.sh 添加为一个 alias,无需指定完整路径运行,只需要重新登录 ssh 即可。
配置 acme.sh 使用 Let’s Encrypt
因为 acme.sh 收了 ZeroSSL 的钱,因此现在默认使用的是 ZeroSSL。如果要使用 Let’s Encrypt 需要进行配置:
acme.sh --set-default-ca --server letsencrypt申请 IP 证书
使用以下命令申请证书:
acme.sh --issue -d <IP 地址> -w <网站根目录> --certificate-profile shortlived --days 84NOTE
网站根目录为你当前 80 端口部署的服务的根目录。如果你的 Nginx 是作为反向代理使用的,没有实际的网页文件,请务必在 Nginx 的 80 端口配置中加入以下代码,否则 CA 无法读取到验证文件。location ~ ^/.well-known/(acme-challenge|pki-validation)/ {add_header Content-Type text/plain;root /var/www/html;;}
签发之后 acme.sh 会自动添加一个 cronjob,无需手动配置自动续签。
生成的证书默认存储在 /root/.acme.sh/1.2.3.4_ecc/ 目录:
fullchain.cer:完整证书链1.2.3.4.key:私钥文件
部署证书
在证书签发下来后,直接在 Nginx 里引用 root 目录的证书文件可能会有权限隐患,因此需要把证书部署到一个专门的生产路径。
创建存放证书的目录:
sudo mkdir -p /etc/nginx/ssl/1.2.3.4使用以下命令将证书部署到该生产路径:
acme.sh --install-cert -d 1.2.3.4 --ecc \--key-file /etc/nginx/ssl/1.2.3.4/key.pem \--fullchain-file /etc/nginx/ssl/1.2.3.4/cert.pem \--reloadcmd "systemctl force-reload nginx"NOTE后续每次续签完成后,acme 会自动把证书更新到生产路径,并重启 Nginx。
配置证书
在 Nginx 中配置证书:
server_name 1.2.3.4; # 改为你的 IP ssl_certificate /etc/nginx/ssl/1.2.3.4/cert.pem; ssl_certificate_key /etc/nginx/ssl/1.2.3.4/key.pem;检查配置文件并重启 Nginx。打开我的 Openlist,可以看到证书已经配置好了:
