找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

937

积分

0

好友

120

主题
发表于 6 天前 | 查看: 19| 回复: 0

图片

在上一章回顾了 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 参数。以下是指令的详细解析。

核心指令参数

  1. ssl_certificatessl_certificate_key

    • ssl_certificate 指定服务器公钥证书文件路径。从 1.11.0 开始可指定多个(如 RSA 和 ECDSA 证书)。
    • ssl_certificate_key 指定与证书对应的私钥文件路径。
      ssl_certificate     /usr/local/nginx/certs/server.crt;
      ssl_certificate_key /usr/local/nginx/certs/server.key;
  2. ssl_password_file

    • 当私钥文件被加密时,此指令指定包含解密密码的文件路径。
      # 生成随机密码并加密私钥
      openssl rsa -aes256 -in server.key -out server_encrypted.key -passout pass:YourStrongPassword
      ssl_password_file /usr/local/nginx/certs/ssl_password.txt;
  3. ssl_protocols

    • 指定启用的 SSL/TLS 协议版本。为符合安全最佳实践,默认及推荐配置为 TLSv1.2 TLSv1.3
      ssl_protocols TLSv1.2 TLSv1.3;
  4. ssl_ciphers

    • 指定加密套件列表。应避免使用不安全的算法(如 MD5、RC4),选择安全性高且兼容性好的套件。
      ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!RC4;
  5. ssl_session_cachessl_session_timeout

    • ssl_session_cache 配置会话缓存,推荐使用共享内存方式,1MB约存储4000个会话。
    • ssl_session_timeout 设置会话超时时间。
      ssl_session_cache shared:SSL:10m;
      ssl_session_timeout 10m;
  6. 其他相关指令

    • ssl_prefer_server_ciphers on;:优先使用服务端定义的加密套件顺序。
    • ssl_buffer_size 4k;:设置发送缓冲区大小,较小值有助于降低首字节到达时间。

配置实践:Nginx HTTPS 单向认证站点

以下是一个完整的 Nginx 服务端 SSL 单向认证配置示例。

步骤 1. 准备证书文件
将前面生成的 server.crtserver.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 导入到操作系统或浏览器的“受信任的根证书颁发机构”存储区。完成后,浏览器访问时将显示安全的锁标志。

图片.png

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

图片




上一篇:通达OA渗透测试指南:多款主流漏洞检测工具对比与实战应用
下一篇:Linux常用命令实战指南:系统管理与文件操作核心技巧
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-25 01:10 , Processed in 0.327076 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表