11人参与 • 2026-08-02 • Mysql
在开发和测试环境中,我们常常使用 openssl req -x509 生成的自签名证书。然而,这种方式存在一个根本性问题:信任缺失。每个新证书都需要手动导入浏览器,管理成本极高。
真正的解决方案是什么?—— 建立自己的私有 pki (public key infrastructure) 体系!
通过创建一个私有的 ca (certificate authority),你可以像 digicert 或 let's encrypt 一样,为你所有的内网服务(nginx、数据库、api网关等)签发证书。客户端只需信任你的根 ca 一次,就能自动信任所有由它签发的证书。这不仅是技术上的升级,更是管理理念的飞跃。
💡 核心价值:
掌握 nginx-ca 签名,是构建可扩展、易管理、高可信度内网安全通信体系的基石!
理解了原理,操作才能得心应手。
# 1. 创建一个工作目录
mkdir ~/my-pki && cd ~/my-pki
# 2. 生成 ca 私钥 (4096位更安全)
openssl genrsa -out ca.key 4096
# 3. 生成 ca 根证书 (有效期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,我们需要使用 subject alternative name (san)。
openssl genrsa -out server.key 2048
创建一个名为 v3.ext 的文件,内容如下:
authoritykeyidentifier=keyid,issuer basicconstraints=ca:false keyusage = digitalsignature, nonrepudiation, keyencipherment, dataencipherment subjectaltname = @alt_names [alt_names] dns.1 = nginx.internal dns.2 = api.internal ip.1 = 192.168.10.100 ip.2 = 127.0.0.1
根据你的实际需求修改 dns.x 和 ip.x。
openssl req -new -key server.key -out server.csr \
-subj "/c=cn/st=beijing/l=beijing/o=mycompany/cn=nginx.internal"openssl x509 -req -in server.csr -ca ca.crt -cakey ca.key -cacreateserial \
-out server.crt -days 365 -sha256 -extfile v3.ext执行后,你会得到 nginx 所需的 server.key 和 server.crt。
将证书文件复制到 nginx 的配置目录:
sudo mkdir -p /etc/nginx/ssl sudo cp server.key server.crt /etc/nginx/ssl/
编辑 nginx 配置文件 (/etc/nginx/sites-available/default 或类似路径):
server {
listen 443 ssl http2;
# 填写证书中的任意一个域名
server_name nginx.internal api.internal;
# 指向由 ca 签名的证书和私钥
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# 安全加固
ssl_protocols tlsv1.2 tlsv1.3;
ssl_ciphers ecdhe-rsa-aes256-gcm-sha512:dhe-rsa-aes256-gcm-sha512;
ssl_prefer_server_ciphers off;
location / {
root /var/www/html;
index index.html;
}
}
# 强制 http 跳转 https
server {
listen 80;
server_name nginx.internal api.internal;
return 301 https://$host$request_uri;
}重载 nginx:
sudo nginx -t && sudo systemctl reload nginx
为了让所有客户端无警告地访问你的 nginx 服务,必须将 ca.crt 部署到它们的信任库中。
ca.crt 推送到所有域计算机的“受信任的根证书颁发机构”。ca.crt 复制到 /usr/local/share/ca-certificates/ 并运行 sudo update-ca-certificates。ca.crt -> “安装证书” -> “本地计算机” -> “受信任的根证书颁发机构”。ca.crt -> 在“钥匙串访问”的“系统”中找到它 -> 双击 -> “始终信任”。效果:安装完成后,所有由你的私有 ca 签发的证书都将被浏览器视为完全可信,地址栏会显示一个完美的灰色锁图标。
ca 签名的强大之处不仅在于服务端认证,还能实现双向认证 (mtls)。在这种模式下,不仅服务器要向客户端证明身份,客户端也必须向服务器提供由可信 ca 签发的证书。
应用场景:微服务间的安全通信、高安全级别的 api 访问。
nginx 配置示例:
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# 开启客户端证书验证
ssl_verify_client on;
# 指定用于验证客户端证书的 ca
ssl_client_certificate /etc/nginx/ssl/ca.crt;
location /secure-api/ {
# 只有持有有效客户端证书的请求才能通过
proxy_pass http://backend;
}
}到此这篇关于nginx中ca签名证书的实现的文章就介绍到这了,更多相关nginx ca签名证书内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论