openssl自建私有ca是内网/测试环境https及双向认证最灵活方案,支持任意域名/ip、自定义扩展、策略控制与吊销;需先建离线根ca,再签发服务器证书和客户端证书,并做好密钥保管与周期管理。

直接用 OpenSSL 自建私有 CA,是给内网服务、测试环境或微服务间通信配 HTTPS 和双向认证最灵活的方式。它不依赖公网 CA,支持任意域名、IP、自定义扩展字段,还能控制签发策略和吊销机制。
一、搭建可信根CA(信任锚点)
所有后续证书的信任都源于这个根证书,必须安全生成并离线保管。
- 创建专用目录,避免密钥混杂:
mkdir -p my-ca/{private,csr,certs,newcerts} && touch my-ca/index.txt && echo 1000 > my-ca/serial - 生成加密的 4096 位 RSA 根私钥:
openssl genrsa -aes256 -out my-ca/private/rootCA.key 4096(务必记牢密码) - 编写
rootCA.cnf配置,明确声明basicConstraints = critical, CA:true和keyUsage = critical, keyCertSign, cRLSign - 签发 10 年有效期的自签名根证书:
openssl req -x509 -new -nodes -key my-ca/private/rootCA.key -sha256 -days 3650 -out my-ca/certs/rootCA.crt -config rootCA.cnf - 验证是否生效:
openssl x509 -in my-ca/certs/rootCA.crt -text -noout | grep -A1 "CA:"应显示CA:TRUE
二、为服务器生成 HTTPS 证书(单向认证)
这是让 Nginx/Apache 等服务启用 HTTPS 的标准流程,证书需绑定具体域名或 IP。
- 生成服务器私钥(不加密,便于服务自动加载):
openssl genrsa -out server.key 2048 - 创建 CSR,指定 SAN(关键!支持多域名/IP):
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=MyApp/CN=localhost" -addext "subjectAltName=DNS:localhost,IP:127.0.0.1,IP:192.168.1.100" - 用根 CA 签发证书,启用 v3 扩展(含 SAN 和服务器用途):
openssl x509 -req -in server.csr -CA my-ca/certs/rootCA.crt -CAkey my-ca/private/rootCA.key -CAcreateserial -out server.crt -days 365 -sha256 -extfile - 合并证书链(若未来引入中间 CA,此处需追加):
cat server.crt my-ca/certs/rootCA.crt > server-fullchain.crt
三、启用客户端双向认证(mTLS)
服务器不仅出示证书,还要校验客户端身份,适合 API 网关、K8s 控制面等高安全场景。
- 为每个客户端单独生成密钥和 CSR:
openssl genrsa -out client1.key 2048 && openssl req -new -key client1.key -out client1.csr -subj "/C=CN/O=MyApp/CN=client1" - 用同一根 CA 签发客户端证书,并指定用途:
openssl x509 -req -in client1.csr -CA my-ca/certs/rootCA.crt -CAkey my-ca/private/rootCA.key -CAcreateserial -out client1.crt -days 365 -sha256 -extfile - Nginx 配置中开启验证:
ssl_client_certificate /path/to/rootCA.crt; ssl_verify_client on;,并用$ssl_client_s_dn提取客户端标识做鉴权
四、日常管理与安全要点
证书不是一次生成就完事,需配套维护机制。
- 根私钥必须离线保存,签发操作尽量在隔离环境进行;临时解密可用
openssl rsa -in rootCA.key -out rootCA.key.unsecure,用完立即删 - 定期检查证书过期:
openssl x509 -in server.crt -enddate -noout,可写脚本批量扫描 - 如需吊销,更新
my-ca/index.txt将对应行首改为R,再用openssl ca -gencrl -out crl.pem -config openssl.cnf生成 CRL - 浏览器或系统要信任该 CA,需手动将
rootCA.crt导入“受信任的根证书颁发机构”存储区











