背景痛点

在私有云或K8s内网环境中,我们经常需要给IP地址配置HTTPS加密。传统做法是使用自签名证书,但这会带来两个问题:

  • 浏览器会显示安全警告,影响用户体验
  • 需要手动维护信任链,管理成本高

而公共CA签发的IP证书则可以完美解决这些问题。Let's Encrypt从2021年开始支持IP证书,为我们提供了免费的选择。

内网HTTPS架构示意图

工具选型

常见的证书管理工具有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的生产环境

DNS验证流程

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加密。相比自签名证书,这套方案不仅更安全,还能获得浏览器的完全信任,大大提升了内网服务的使用体验。

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐