文档版本: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.key | CA 私钥 | ⚠️ 绝密,离线存储 |
ca.crt | CA 证书 | 公开分发 |
步骤 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.125.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 到「受信任的根证书」 |
| curl | curl --cacert ca.crt https://10.113.120.12 |
六、注意事项
| # | 事项 | 说明 |
|---|---|---|
| 1 | CA 私钥安全 | ca.key 一旦泄露,攻击者可为任意域名/IP 签发可信证书;建议加密存储或离线保存 |
| 2 | 有效期 | 26645 天 ≈ 73 年,仅适合内网/测试;生产环境建议 365–825 天 |
| 3 | 证书轮换 | 到期前需重新签发,客户端无需重新信任 CA(CA 未变) |
| 4 | CN 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
评论