
在上一章回顾了 Nginx 中 HTTP 反向代理的流程后,我们继续深入学习 Nginx 在安全传输方面的进阶应用——配置 SSL/TLS 站点。HTTPS 协议基于 SSL/TLS 实现数据加密传输,是当前互联网站点的安全标配。本章将详细介绍自签 SSL 证书的签发方法,并深入解析在 Nginx 中配置单向 SSL 认证的相关指令与实践。
自签 SSL 证书申请与签发实践
在内部系统或开发测试环境中,我们通常使用自签证书。下面以 openssl 命令为例,演示如何生成 CA 证书、服务端证书、客户端证书及多域名证书。
实践步骤
步骤 1. 生成 CA 证书
# 1. 创建 CA 私钥
openssl genrsa -out ca.key 2048
# 2. 创建带有 SAN 扩展的 CA 证书请求配置文件
tee ca.cnf << EOF
[req]
default_bits = 2048
default_md = sha256
prompt = no
distinguished_name = dn
x509_extensions = v3_ca
[dn]
countryName = CN
stateOrProvinceName = Chongqing
localityName = Chongqing
organizationName = WeiyiGeek
organizationalUnitName = root
commonName = ca.weiyigeek.top
[v3_ca]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
subjectAltName = @alt_names
[alt_names]
DNS.1 = ca.weiyigeek.top
IP.1 = 10.20.172.214
email.1 = ca@weiyigeek.top
URI.1 = https://ca.weiyigeek.top/ca
EOF
# 3. 生成 CSR 并自签 CA 证书(有效期10年)
openssl req -new -key ca.key -out ca.csr -config ca.cnf
openssl x509 -req -sha256 -days 3650 -key ca.key -in ca.csr -out ca.crt -extfile ca.cnf -extensions v3_ca
# 4. 查看证书内容
openssl x509 -in ca.crt -noout -text
步骤 2. 使用 CA 颁发 Nginx 服务端证书
# 1. 生成服务端私钥
openssl genrsa -out server.key 2048
# 2. 生成服务端证书请求
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Chongqing/L=Chongqing/O=WeiyiGeek/OU=Nginx Server/CN=server.weiyigeek.top"
# 3. 创建服务端证书扩展配置文件
tee server.ext << EOF
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = server.weiyigeek.top
IP.1 = 10.20.172.214
EOF
# 4. 使用 CA 签发服务端证书
openssl x509 -req -sha256 -days 365 \
-in server.csr \
-CA ca.crt -CAkey ca.key \
-CAcreateserial \
-out server.crt \
-extfile server.ext
# 5. 验证证书
openssl verify -CAfile ca.crt server.crt
步骤 3. 使用 CA 颁发客户端证书
此证书将用于后续的双向认证演示。
# 1. 生成客户端私钥
openssl genrsa -out client.key 2048
# 2. 生成客户端证书请求
openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Chongqing/L=Chongqing/O=WeiyiGeek/OU=Client Department/CN=client.weiyigeek.top"
# 3. 创建客户端证书扩展配置文件
tee client.ext << EOF
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = client.weiyigeek.top
IP.1 = 10.20.172.214
EOF
# 4. 使用 CA 签发客户端证书
openssl x509 -req -sha256 -days 365 \
-in client.csr \
-CA ca.crt -CAkey ca.key \
-CAcreateserial \
-out client.crt \
-extfile client.ext
步骤 4. 使用 CA 颁发上游应用多域名证书
此证书可用于后续Nginx反向代理到上游HTTPS服务的场景。
# 1. 生成应用私钥
openssl genrsa -out app.key 2048
# 2. 生成应用证书请求(使用通配符CN)
openssl req -new -key app.key -out app.csr -subj "/C=CN/ST=Chongqing/L=Chongqing/O=WeiyiGeek/OU=App Server/CN=*.weiyigeek.top"
# 3. 创建多域名证书扩展配置文件
tee app.ext << EOF
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = app1.weiyigeek.top
DNS.2 = app2.weiyigeek.top
IP.1 = 10.20.172.213
EOF
# 4. 使用 CA 签发应用证书
openssl x509 -req -sha256 -days 365 \
-in app.csr \
-CA ca.crt -CAkey ca.key \
-CAcreateserial \
-out app.crt \
-extfile app.ext
将生成的所有证书文件拷贝至 Nginx 的证书目录(如 /usr/local/nginx/certs/),并设置严格的权限:
chmod 600 ca.key ca.crt client.key client.crt server.key server.crt app.key app.crt
Nginx 中 SSL 单向认证指令解析与配置
Nginx 通过 ngx_http_ssl_module 模块提供 HTTPS 支持,编译时需使用 --with-http_ssl_module 参数。以下是指令的详细解析。
核心指令参数
-
ssl_certificate 与 ssl_certificate_key
-
ssl_password_file
-
ssl_protocols
-
ssl_ciphers
-
ssl_session_cache 与 ssl_session_timeout
-
其他相关指令
ssl_prefer_server_ciphers on;:优先使用服务端定义的加密套件顺序。
ssl_buffer_size 4k;:设置发送缓冲区大小,较小值有助于降低首字节到达时间。
配置实践:Nginx HTTPS 单向认证站点
以下是一个完整的 Nginx 服务端 SSL 单向认证配置示例。
步骤 1. 准备证书文件
将前面生成的 server.crt、server.key(或加密后的 server_encrypted.key 及密码文件)放置于 Nginx 证书目录。
步骤 2. 编写 Nginx 配置文件
# /usr/local/nginx/conf.d/ssl_server.conf
server {
listen 80;
# 在 listen 指令中启用 ssl 参数
listen 443 ssl;
server_name server.weiyigeek.top;
# 开启 HTTP/2 支持(需编译时添加 --with-http_v2_module)
http2 on;
access_log /var/log/nginx/server.log main;
error_log /var/log/nginx/server.err.log debug;
# SSL 基础配置
ssl_certificate /usr/local/nginx/certs/server.crt;
ssl_certificate_key /usr/local/nginx/certs/server_encrypted.key;
ssl_password_file /usr/local/nginx/certs/ssl_password.txt;
# 协议与加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...:!MD5:!RC4;
ssl_prefer_server_ciphers on;
# 会话优化
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 安全响应头(强制 HTTPS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
location / {
root /usr/local/nginx/html;
index index.html;
}
}
步骤 3. 重启 Nginx 并测试
nginx -s reload
配置本地 Hosts 文件将 server.weiyigeek.top 解析到服务器 IP,然后在浏览器中访问 https://server.weiyigeek.top。由于使用的是自签证书,浏览器会提示连接不安全,可暂时忽略警告继续访问。
步骤 4. 导入 CA 证书使浏览器信任(可选)
为了消除浏览器警告,可以将根 CA 证书 ca.crt 导入到操作系统或浏览器的“受信任的根证书颁发机构”存储区。完成后,浏览器访问时将显示安全的锁标志。

至此,在 Nginx 中配置基于自签证书的 HTTPS 单向认证站点已全部完成。此配置为后续实现客户端与服务端双向 SSL 认证、以及 Nginx 与上游 HTTPS 服务的安全通信奠定了基础。
