自签SSL证书终极方案:根CA一次配置,永久信任所有子证书
在开发和测试环境中,如果为每个服务都单独生成自签名证书,浏览器会频繁弹出“不安全”的警告,且每次都需要手动导入,管理成本极高。真正的终极解决方案是:建立自己的私有PKI(公钥基础设施)体系。
其核心原理是:创建一个私有根CA(Certificate Authority),用它来签发所有的服务器证书。客户端(浏览器或操作系统)只需要信任这个根CA一次,就能自动信任由它签发的所有子证书。
以下是构建私有CA并实现“一次配置,永久信任”的完整实战方案:
第一步:创建私有根CA(信任的源头)
根CA是整个信任体系的“宪法”,必须妥善保管。
创建工作目录并生成高强度的CA私钥(建议4096位):
openssl genrsa -out ca.key 4096
生成自签名的根证书(可设置较长有效期,如10年):
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=My Internal Root CA"
第二步:为服务器签发证书
为了让证书支持多域名和IP,需要借助SAN(Subject Alternative Name)扩展字段。
生成服务器私钥:
openssl genrsa -out server.key 2048
创建SAN扩展配置文件(如 v3.ext),绑定具体的域名和IP:
authorityKeyIdentifier=keyid,issuerbasicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = nginx.internal
IP.1 = 192.168.10.100
生成证书签名请求(CSR):
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=nginx.internal"
使用根CA签署服务器证书:
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256 -extfile v3.ext
第三步:客户端“一次配置,永久信任”
将根证书(ca.crt)安装到所有需要访问服务的客户端信任库中。不同平台的配置方式如下:
Windows:双击 ca.crt,选择“安装证书”,将其放入“受信任的根证书颁发机构”存储区。
macOS:双击证书打开“钥匙串访问”,将其添加到“系统”钥匙串,并设置信任方式为“始终信任”。
Linux:将证书复制到 /usr/local/share/ca-certificates/,然后执行 sudo update-ca-certificates 更新系统信任库。
Firefox浏览器:由于Firefox不使用系统证书库,需在“隐私与安全”设置中手动导入该CA证书。
第四步:部署到 Nginx
将生成的 server.crt 和 server.key 配置到 Nginx 中,重启服务即可。
💡 进阶替代方案:使用 mkcert 工具
如果你觉得 OpenSSL 命令过于繁琐,可以使用专为本地开发设计的工具 mkcert。它会自动在本地创建一个根CA并安装到系统的信任存储中。之后,你只需执行 mkcert example.com "*.example.com" 即可一键生成受信任的证书。若要在多台机器间同步信任,只需将 mkcert 生成的根证书(如 rootCA.pem)拷贝到其他机器上手动安装即可。
⚠️ 安全提示:自签名证书及其私有CA仅适用于内网、本地开发或测试环境。在生产环境中,请务必使用由受信任的全球公共CA(如 DigiCert、Let's Encrypt)签发的证书。