为公网 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.com

2. 使用 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:替换为你的域名或公网 IP
  • location ^~ /.well-known/acme-challenge/:精确前缀匹配,专门处理 Let’s Encrypt 的验证请求,文件根目录指向 /var/www
  • location /:其他所有请求 301 重定向到 HTTPS

3.2 创建验证目录

确保验证目录存在并具有正确的权限:

sudo mkdir -p /var/www/.well-known/acme-challenge
sudo chown -R www-data:www-data /var/www/.well-known

3.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>/

不过不建议直接引用这些文件,原因如下:

  1. ~/.acme.sh/ 目录通常属于当前用户权限,其他用户可能无法读取;
  2. 证书自动更新后,业务服务不会自动感知并重载新证书。

正确做法:使用 --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 --force

5.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-证书/
作者
nafeuy
发布于
2026年6月27日
许可协议