Nginx-CA 签名

一、引言:从"自签"到"CA签"的质变

在开发和测试环境中,我们常常使用 openssl req -x509 生成的自签名证书。然而,这种方式存在一个根本性问题:信任缺失。每个新证书都需要手动导入浏览器,管理成本极高。

真正的解决方案是什么?------ 建立自己的私有 PKI(Public Key Infrastructure) 体系!

通过创建一个私有的 CA(Certificate Authority),你可以像 DigiCert 或 Let's Encrypt 一样,为你所有的内网服务(Nginx、数据库、API网关等)签发证书。客户端只需信任你的根 CA 一次,就能自动信任所有由它签发的证书。这不仅是技术上的升级,更是管理理念的飞跃。

💡 核心价值 :

掌握 Nginx-CA 签名,是构建可扩展、易管理、高可信度内网安全通信体系的基石!


二、核心原理:PKI 信任链是如何工作的?

理解了原理,操作才能得心应手。

  1. 创建根 CA : 你首先生成一个根 CA 的私钥 (ca.key) 和自签名的根证书 (ca.crt)。这个 ca.crt 就是整个信任体系的"宪法"。
  2. 签发服务器证书 : 为你的 Nginx 服务器生成一对密钥 (server.key, server.csr),然后用你的根 CA 私钥对这个 CSR 进行签名,生成 server.crt。
  3. 建立信任 : 将根 CA 证书 (ca.crt) 安装到所有需要访问 Nginx 的客户端(浏览器、操作系统)的信任库中。
  4. 验证过程 : 当客户端连接 Nginx 时:
    • Nginx 发送 server.crt。
    • 客户端发现该证书是由 My Internal Root CA 签发的。
    • 客户端检查自己的信任库,找到了 My Internal Root CA 的公钥 (ca.crt)。
    • 客户端用 ca.crt 的公钥成功验证了 server.crt 的签名。
    • 信任建立! 连接被认定为安全。

三、实战:使用 OpenSSL 构建私有 CA 并签发 Nginx 证书

第一步:创建私有根 CA

bash 复制代码
# 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"

第二步:为 Nginx 服务器签发证书

为了支持多域名和 IP,我们需要使用 Subject Alternative Name (SAN)。

1. 生成服务器私钥
bash 复制代码
openssl genrsa -out server.key 2048
2. 创建 SAN 扩展配置文件 (v3.ext)

创建一个名为 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。

3. 生成证书签名请求 (CSR)
bash 复制代码
openssl req -new -key server.key -out server.csr \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=nginx.internal"
4. 使用 CA 签署服务器证书
bash 复制代码
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 启用 HTTPS

将证书文件复制到 Nginx 的配置目录:

bash 复制代码
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:

bash 复制代码
sudo nginx -t && sudo systemctl reload nginx

五、终极信任:部署根 CA 证书

为了让所有客户端无警告地访问你的 Nginx 服务,必须将 ca.crt 部署到它们的信任库中。

在企业环境中批量部署

  • Windows 域环境 : 通过组策略 (GPO) 将 ca.crt 推送到所有域计算机的"受信任的根证书颁发机构"。
  • macOS MDM: 使用移动设备管理工具(如 Jamf Pro)进行推送。
  • Linux : 将 ca.crt 复制到 /usr/local/share/ca-certificates/ 并运行 sudo update-ca-certificates。

在个人开发机上手动安装

  • Windows : 双击 ca.crt -> "安装证书" -> "本地计算机" -> "受信任的根证书颁发机构"。
  • macOS : 双击 ca.crt -> 在"钥匙串访问"的"系统"中找到它 -> 双击 -> "始终信任"。

效果:安装完成后,所有由你的私有 CA 签发的证书都将被浏览器视为完全可信,地址栏会显示一个完美的灰色锁图标。


六、进阶应用:Nginx 双向认证 (mTLS)

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;
    }
}

七、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
云宏信息2 小时前
超融合和存算分离怎么选?从性能、可靠性、扩展、成本四个维度讲述如何精准匹配架构选型 | 附企业降本轻量云方案
运维·服务器·架构·云计算
咸鱼梦想家π3 小时前
Linux开发工具(下)
linux·运维·服务器
云飞云共享云桌面4 小时前
机械制造研发部门:一台SolidWorks云主机替代 10 台传统图形工作站
运维·服务器·网络·3d·自动化·制造
j7~4 小时前
【ProtoBuf】(篇一)初识 ProtoBuf
运维·服务器·序列化·protobuf·protobuf的适用特点
DevLoom_4 小时前
macOS 命令行 curl/git 报 SSL 证书错误?eMudhra 事件完整修复指南
git·macos·ssl
丰锋ff5 小时前
用户管理命令
linux·运维·服务器
BcoreOS5 小时前
‌新手必看:Debian 13 虚拟机 SSH 连不上?我是怎么一步步调试成功的
服务器
迪菲赫尔曼5 小时前
【基础篇 08】让VS Code连接服务器:界面在本地,文件保存到远端
运维·服务器·vscode·yolo·论文·教程·ultralyt
东方佑5 小时前
去魅:工具调用、Agent 调用、A2A、MCP、Harness 到底都是什么
服务器·网络·数据库
H.莓飛5 小时前
【数据结构】排序总结与规模实测
linux·服务器·开发语言·数据结构·visual studio·1024程序员节