acme.sh实战指南:如何快速为IP地址申请SSL证书
·
背景痛点
在私有云或K8s内网环境中,我们经常需要给IP地址配置HTTPS加密。传统做法是使用自签名证书,但这会带来两个问题:
- 浏览器会显示安全警告,影响用户体验
- 需要手动维护信任链,管理成本高
而公共CA签发的IP证书则可以完美解决这些问题。Let's Encrypt从2021年开始支持IP证书,为我们提供了免费的选择。

工具选型
常见的证书管理工具有certbot和acme.sh,我们选择后者是因为:
- 纯Shell编写,无需Python环境,更轻量
- 支持DNS-01验证方式,适合没有公网端口的IP证书申请
- 自动续期功能完善,集成更方便
实战步骤
1. 安装acme.sh
curl https://get.acme.sh | sh -s email=your@email.com
source ~/.bashrc
2. 配置Cloudflare API
先在Cloudflare控制面板获取API Token,然后执行:
export CF_Token="你的API_Token"
export CF_Account_ID="你的Account_ID"
3. 申请证书
acme.sh --issue --dns dns_cf -d 192.168.1.1 \
--server letsencrypt \
--key-file /etc/nginx/ssl/ip.key \
--fullchain-file /etc/nginx/ssl/ip.crt
参数说明: - --dns dns_cf: 使用Cloudflare DNS验证 - -d 192.168.1.1: 要申请证书的IP地址 - --server letsencrypt: 使用Let's Encrypt的生产环境

4. Nginx配置
server {
listen 443 ssl;
server_name 192.168.1.1;
ssl_certificate /etc/nginx/ssl/ip.crt;
ssl_certificate_key /etc/nginx/ssl/ip.key;
# 启用OCSP装订
ssl_stapling on;
ssl_stapling_verify on;
# 其他配置...
}
生产级考量
自动续期
添加crontab任务(acme.sh安装时已自动配置):
0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
私钥权限
chmod 400 /etc/nginx/ssl/ip.key
chown root:root /etc/nginx/ssl/ip.key
OCSP装订优化
在Nginx配置中添加:
ssl_trusted_certificate /etc/nginx/ssl/ca.crt;
避坑指南
速率限制
Let's Encrypt对IP证书有以下限制: - 每个注册域名每周最多5张证书 - 每个IP每周最多5张证书
DNS验证失败
常见原因: 1. API Token权限不足 2. DNS记录传播延迟 3. 防火墙拦截API请求
调试命令:
dig TXT _acme-challenge.yourdomain.com +short
Android兼容性
确保证书链完整:
acme.sh --install-cert -d 192.168.1.1 \
--key-file /path/to/key \
--fullchain-file /path/to/fullchain \
--reloadcmd "service nginx force-reload"
健康检查脚本
保存为check_ssl.sh:
#!/bin/bash
IP="192.168.1.1"
PORT=443
openssl s_client -connect ${IP}:${PORT} -servername ${IP} < /dev/null 2>/dev/null | \
openssl x509 -noout -dates
echo "OCSP响应状态:"
openssl s_client -connect ${IP}:${PORT} -status < /dev/null 2>/dev/null | \
grep -A 17 "OCSP response:" | grep -B 17 "^$"
给执行权限:
chmod +x check_ssl.sh
通过这个指南,我们成功实现了内网IP的HTTPS加密。相比自签名证书,这套方案不仅更安全,还能获得浏览器的完全信任,大大提升了内网服务的使用体验。
更多推荐

所有评论(0)