使用私有 CA 为内网 IP 签发 TLS 服务器证书
侧边栏壁纸
  • 累计撰写 5 篇文章
  • 累计收到 0 条评论

使用私有 CA 为内网 IP 签发 TLS 服务器证书

agblr
2026-08-26 / 0 评论 / 1 阅读 / 正在检测是否收录...

文档版本:v1.0
适用场景:内网服务(如 Kubernetes、Web 服务、中间件)使用 IP 地址访问,需启用 HTTPS
证书有效期:约 73 年(26645 天,仅适合内网/测试,生产建议 1–3 年)


一、前置条件

项目要求
操作系统Linux / macOS
工具OpenSSL 1.1.1 及以上
权限可创建目录、生成文件的普通用户即可
网络无外网要求

二、证书体系说明

根 CA(自签)
 ├── ca.key   # CA 私钥(必须严格保密)
 ├── ca.crt   # CA 证书(分发到所有客户端信任库)
 │
 └── 服务器证书(由 CA 签发)
      ├── server.key   # 服务器私钥
      ├── public.crt   # 服务器证书(含 IP SAN)
      └── chain.crt    # 证书链(单级 CA = ca.crt)


关键点:客户端(浏览器/程序)只需信任 ca.crt,即可信任该 CA 签发的所有服务器证书。

三、操作步骤

步骤 1:创建根 CA(只需执行一次)

# 1. 生成 CA 私钥
openssl genrsa -out ca.key 4096

# 2. 自签 CA 证书
openssl req -x509 -new -nodes -key ca.key -sha256 -days 26645 \
  -subj "/C=CN/ST=Fujian/L=Xiamen/O=G8.6/OU=CIM/CN=G8.6-CIM-IS" \
  -out ca.crt

产出文件

文件说明保密级别
ca.keyCA 私钥⚠️ 绝密,离线存储
ca.crtCA 证书公开分发

步骤 2:为服务器 IP 签发证书

以下以 10.113.120.12 为例,多台服务器重复此步骤即可。
IP=10.113.120.12
mkdir -p certs/$IP

# 2.1 生成服务器私钥
openssl genrsa -out certs/$IP/server.key 2048

# 2.2 生成 CSR(CN 填 IP,实际校验以 SAN 为准)
openssl req -new -key certs/$IP/server.key \
  -subj "/C=CN/ST=Fujian/L=Xiamen/O=G8.6/OU=CIM/CN=$IP" \
  -out certs/$IP/server.csr

# 2.3 CA 签发证书(强制写入 IP SAN)
openssl x509 -req -in certs/$IP/server.csr \
  -CA ca.crt -CAkey ca.key -CAcreateserial \
  -days 26645 -sha256 -out certs/$IP/public.crt \
  -extfile <(printf "basicConstraints=CA:FALSE\nkeyUsage=digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth\nsubjectAltName=IP:%s" $IP)

# 2.4 生成证书链(单级 CA,chain.crt = ca.crt)
cp ca.crt certs/$IP/chain.crt

产出文件(每台服务器独立目录):

文件说明部署位置
server.key服务器私钥服务端,权限 600
public.crt服务器证书服务端
chain.crt证书链服务端(部分程序需要)

步骤 3:为更多服务器重复签发(示例)

# 第二台服务器
IP=10.113.120.13
mkdir -p certs/$IP

openssl genrsa -out certs/$IP/server.key 2048

openssl req -new -key certs/$IP/server.key \
  -subj "/C=CN/ST=Fujian/L=Xiamen/O=G8.6/OU=CIM/CN=$IP" \
  -out certs/$IP/server.csr

openssl x509 -req -in certs/$IP/server.csr \
  -CA ca.crt -CAkey ca.key -CAcreateserial \
  -days 26645 -sha256 -out certs/$IP/public.crt \
  -extfile <(printf "basicConstraints=CA:FALSE\nkeyUsage=digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth\nsubjectAltName=IP:%s" $IP)

cp ca.crt certs/$IP/chain.crt
📌 提示:可将步骤 2 封装为脚本 issue-cert.sh <IP>,避免重复劳动。

四、最终目录结构

.
├── ca.key              # CA 私钥(绝密)
├── ca.crt              # CA 证书(分发给客户端)
├── ca.srl              # CA 序列号(自动生成,保留)
└── certs/
    ├── 10.113.120.12/
    │   ├── server.key  # 服务器私钥
    │   ├── server.csr  # CSR(可归档或删除)
    │   ├── public.crt  # 服务器证书
    │   └── chain.crt   # 证书链
    └── 10.113.120.13/
        ├── server.key
        ├── server.csr
        ├── public.crt
        └── chain.crt

五、验证

5.1 检查证书内容(确认 IP SAN 已写入)

openssl x509 -in certs/10.113.120.12/public.crt -noout -text | grep -A1 "Subject Alternative Name"

预期输出:

X509v3 Subject Alternative Name:
    IP Address:10.113.120.12


5.2 用 OpenSSL 验证证书链

openssl verify -CAfile ca.crt certs/10.113.120.12/public.crt

预期输出:public.crt: OK

5.3 客户端信任配置

客户端操作
Linux(信任系统 CA)ca.crt 复制到 /usr/local/share/ca-certificates/,执行 update-ca-certificates
Windows双击 ca.crt → 安装到「受信任的根证书颁发机构」
Java 应用keytool -import -trustcacerts -file ca.crt -keystore cacerts
浏览器导入 ca.crt 到「受信任的根证书」
curlcurl --cacert ca.crt https://10.113.120.12

六、注意事项

#事项说明
1CA 私钥安全ca.key 一旦泄露,攻击者可为任意域名/IP 签发可信证书;建议加密存储或离线保存
2有效期26645 天 ≈ 73 年,仅适合内网/测试;生产环境建议 365–825 天
3证书轮换到期前需重新签发,客户端无需重新信任 CA(CA 未变)
4CN vs SAN现代客户端(Chrome、Go、Java 等)只认 SAN,CN 仅作兜底;本方案 SAN 已正确配置
5多 IP / DNS如需支持多个 IP 或域名,修改 subjectAltName 行,例如:IP:10.113.120.12,DNS:server.example.com
6权限服务器私钥文件权限建议 600,属主为运行服务的用户

七、附录:快速签发脚本(可选)

如需频繁签发,可保存为 issue-cert.sh

#!/bin/bash
set -e
IP=$1
if [ -z "$IP" ]; then
  echo "用法: $0 <IP地址>"
  exit 1
fi

mkdir -p certs/$IP
openssl genrsa -out certs/$IP/server.key 2048
openssl req -new -key certs/$IP/server.key \
  -subj "/C=CN/ST=Fujian/L=Xiamen/O=G8.6/OU=CIM/CN=$IP" \
  -out certs/$IP/server.csr
openssl x509 -req -in certs/$IP/server.csr \
  -CA ca.crt -CAkey ca.key -CAcreateserial \
  -days 26645 -sha256 -out certs/$IP/public.crt \
  -extfile <(printf "basicConstraints=CA:FALSE\nkeyUsage=digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth\nsubjectAltName=IP:%s" $IP)
cp ca.crt certs/$IP/chain.crt

echo "✅ 证书已生成: certs/$IP/"

赋执行权限:chmod +x issue-cert.sh

使用:./issue-cert.sh 10.113.120.14

0

评论

博主关闭了所有页面的评论