为公网 IP 地址申请 SSL 证书
为公网 IP 地址申请 SSL 证书
说明:Let’s Encrypt 已在 2025 年底正式支持为公网 IP 地址颁发证书。
但这类证书的有效期较短,只有 7 天。可以配合acme.sh的自动续期机制,通过cron定时续签,保证证书始终可用。
1. 安装 acme.sh
方式一:在线安装
一条命令即可完成安装:
curl https://get.acme.sh | sh -s email=my@example.com将
my@example.com替换自己的邮箱地址。
方式二:手动安装
如果服务器无法访问 GitHub,可以先在本地克隆仓库,再上传到服务器安装:
git clone --depth 1 https://github.com/acmesh-official/acme.sh.git
cd acme.sh
./acme.sh --install -m my@example.com2. 使用 standalone 模式申请证书
使用 acme.sh 为公网 IP 地址申请证书:
acme.sh --issue \
-d <IP地址> \
--standalone \
--server letsencrypt \
--certificate-profile shortlived \
--days 6 \参数说明
-d <IP地址>:填写要申请证书的公网 IP 地址--standalone:使用独立模式进行验证,需要临时占用端口--server letsencrypt:指定使用 Let’s Encrypt 作为证书签发机构--certificate-profile shortlived:使用短期证书配置--days 6:设置证书有效期为 6 天
注意:
standalone模式会占用80端口,因此申请证书前要确保该端口没有被 Nginx、Apache 等服务占用。
3. 通过 webroot 方式验证
如果服务器上已有 Nginx 在运行并占用 80 端口,使用 standalone 模式会冲突。此时可以用 webroot 方式完成 HTTP 验证。
3.1 Nginx 配置
以域名为例(公网 IP 同理,server_name 替换为 IP 地址),添加以下 Nginx 配置:
server {
listen 80;
server_name example.com;
location ^~ /.well-known/acme-challenge/ {
root /var/www;
}
location / {
return 301 https://$host$request_uri;
}
}配置说明
listen 80:监听 80 端口处理 HTTP 请求server_name example.com:替换为你的域名或公网 IPlocation ^~ /.well-known/acme-challenge/:精确前缀匹配,专门处理 Let’s Encrypt 的验证请求,文件根目录指向/var/wwwlocation /:其他所有请求 301 重定向到 HTTPS
3.2 创建验证目录
确保验证目录存在并具有正确的权限:
sudo mkdir -p /var/www/.well-known/acme-challenge
sudo chown -R www-data:www-data /var/www/.well-known3.3 使用 webroot 模式申请证书
acme.sh --issue \
-d example.com \
-w /var/www \
--server letsencrypt \
--certificate-profile shortlived \
--days 6参数说明
-w /var/www:指定 webroot 目录,acme.sh会在此目录下创建/.well-known/acme-challenge/临时验证文件- 其余参数与
standalone模式一致
webroot方式的优势是不需要停掉 Nginx 服务,验证过程对现有业务零影响。
4. 安装证书
证书申请成功后,相关文件默认会保存在:
~/.acme.sh/<domain_or_ip>/不过不建议直接引用这些文件,原因如下:
~/.acme.sh/目录通常属于当前用户权限,其他用户可能无法读取;- 证书自动更新后,业务服务不会自动感知并重载新证书。
正确做法:使用 --install-cert
acme.sh 提供了 --install-cert 命令,它会:
- 将证书复制到你指定的目录;
- 在续期后自动执行重载命令。
示例:
acme.sh --install-cert -d example.com \
--fullchain-file /etc/nginx/certs/example.com/fullchain.cer \
--key-file /etc/nginx/certs/example.com/private.key \
--reloadcmd "systemctl reload nginx"参数说明
-d example.com:证书对应的域名或 IP--fullchain-file:指定完整证书链文件的保存路径--key-file:指定私钥文件的保存路径--reloadcmd:证书更新后执行的命令,例如重载 Nginx
5. 使用建议
5.1 自动续期
acme.sh 默认会通过 cron 自动检查并续期证书。
对于短有效期证书尤其重要,建议确认 cron 已正常启用。
查看计划任务:
crontab -l也可以手动强制续期:
acme.sh --cron --force5.2 端口占用检查
如果 standalone 模式申请失败,优先检查 80 端口是否被占用:
sudo lsof -i :80或:
sudo netstat -ltunp | grep :80或:
sudo ss -ltnp | grep :80为公网 IP 地址申请 SSL 证书
https://blog.979909.xyz/2026/06/27/为公网-IP-地址申请-SSL-证书/