大数跨境
0
0

Nginx | 核心知识150讲,百万并发下性能优化之SSL证书签发与HTTPS加密传输实践笔记

Nginx | 核心知识150讲,百万并发下性能优化之SSL证书签发与HTTPS加密传输实践笔记 全栈工程师修炼指南
2025-12-18
2
导读:本文主要讲解了在 Nginx 中配置 HTTPS 站点的相关指令参数,以及介绍使用 openssl 命令生成实践所需的CA证书、服务端和客户端证书,最后通过案例在 Nginx 中配置一个单向的 SSL

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]


📢 大家好,我是 WeiyiGeek一名深耕安全运维开发(SecOpsDev)领域的技术从业者,致力于探索DevOps与安全的融合(DevSecOps),自动化运维工具开发与实践,企业网络安全防护,欢迎各位道友一起学习交流、一起进步 🚀,若此文对你有帮助,一定记得点个关注⭐与小红星❤️或加入到作者知识星球『 全栈工程师修炼指南,转发收藏学习不迷路 😋 。


0x00 前言简述

上一章《Nginx | 核心知识150讲,百万并发下性能优化之HTTP协议中反向代理实践笔记》,一起回顾了 Nginx 中 HTTP 反向代理流程, 另外浅析了 HTTP 反向代理中接收客户端请求处理、与上游服务端建立连接处理,以及和与上游服务端返回响应处理的相关指令参数,此外作者使用了一些示例配置进行了演示,有助于各位看友加深理解,想必认真阅读了上一章内容的看友,应该有所收获吧!

温馨提示:若文章代码块中存在乱码或不能复制,请联系作者,也可通过文末的阅读原文链接,加入知识星球中阅读,原文链接:https://articles.zsxq.com/id_wwnjk3rmwroa.html

保持住这份热情,继续深入学习 Nginx 进阶使用场景,即 Nginx 中配置 SSL/TLS (HTTPS) 站点,对计算机了解的朋友应该都知道,HTTPS (全称:Hypertext Transfer Protocol Secure ),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性,简单来说:HTTPS 协议是基于 SSL/TLS 协议实现的数据加密传输。

大家在访问百度时可能会发现其 URI 地址是以 https 开头的,这表示其数据传输是加密的,运营商各路由转发节点是不知道传递什么内容,所以当前互联网上的绝大多数网站都采用了 HTTPS 协议,此外这也是网络安全等级保护中必须要做的,否则网站将面临被攻击的风险。

当你为网站配置了 SSL 安全证书后,在浏览器中访问时会提示你连接是安全的,当然了如果你是使用的自签证书则浏览器会提示证书不可信,这个是由于自签证书不被浏览器信任,所以需要手动添加 ca 证书到系统、浏览器的可信颁发机构列表中。

图片.png
weiyigeek.top-SSL 安全证书图

实际上第一章中简单的一个示例,如何在 Nginx 中配置一个 SSL/TLS 站点,当时并未展开学习其相关指令参数,正好在学习完 Nginx 反向代理后,便可继续深入学习在 Nginx 中配置一个 SSL/TLS 单向认证站点,客户端 与 Nginx 服务端 SSL/TLS 双向认证,以及 HTTP 协议反向代理中与上游服务端 SSL/TLS 双向认证,先按需学习介绍ssl_* 以及 proxy_ssl_* 相关指令参数,然后再通过示例配置演示,让更多看友可快速上手配置一个安全的 SSL 站点。

OK,开始学习之旅吧!


自签SSL证书申请介绍与签发实践

描述:大家可以选择 letsencrypt 提供的免费通配符证书(有效期三月)或者使用 openssl 命令生成自签证书SSL证书,其不同之处在于,前者 HTTPS 站点在浏览器中访问时,由于颁发的 CA 证书受到系统和浏览器信赖,浏览器不会提示不安全连接,而后者自签的服务端证书,由于不是来自于正规的CA机构签发,所以在在浏览器中访问 HTTPS 站点时,浏览器会提示证书不受信任,但不影响正常使用,可以点击高级继续前往即可。

图片.png
weiyigeek.top-操作系统不信任其安全证书图

其次,自签证书通常用于内部系统,以及开发测试使用居多,所以下文作者将以 openssl 命令生成自签证书SSL证书为例,分别生成 CA 证书,以及使用其颁发 Nginx 服务端证书 (server.weiyigeek.top),客户端证书 (client.weiyigeek.top),以及上游服务端多域名证书 (app1.weiyigeek.top, app2.weiyigeek.top),当然也可参考作者此篇文章《Let'sEncrypt快速颁发及自动续签泛域名证书实践指南》使用 Let's Encrypt 签发通配符证书。

另外,上面提到的多域名证书,是允许一张 ssl 证书绑定多个域名的服务器证书,它有两种叫法,一种:Unified Communications Certificater (来自微软),另一种为SAN certificater(SubjectAltName Certificater)(广泛使用),已经迅速成为一种深受大家欢迎的证书,通过这种证书,可以方便部署 ExchangeNginx(Openresty) 等经常有多个服务名的应用系统,当然还有一种证书即通配符证书,也是同一张 ssl 证书,可绑定任意的域名服务器证书,在生产环境中使用优势比较突出,只不过通常需要在证书服务商进行购买。


实践步骤

  • 步骤 01. 生成 CA 证书
# 1.创建 CA 私钥文件
openssl genrsa -out ca.key 2048

# 2.创建 CA 证书请求文件
# 方式1.创建 CA 证书请求文件没有 SAN 配置
openssl req -new -subj "/C=CN/ST=Chongqing/L=Chongqing/O=WeiyiGeek/OU=root/CN=ca.weiyigeek.top" -key ca.key -out ca1.csr
# -new:生成新的 CSR 请求
# -subj:指定证书主题信息(Distinguished Name),格式为 /属性=值/属性=值/...
# -key:指定私钥文件路径(若无私钥则需先生成)
# -out:指定输出的 CSR 文件路径

# 方式2.使用配置方式生成带有 SAN 配置(推荐)
tee ca.cnf << EOF
[req]
default_bits = 2048
default_md = sha256
prompt = no
distinguished_name = dn
x509_extensions = v3_ca  # 特别注意: CA 证书应使用 x509_extensions 而不是 req_extensions

[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
openssl req -new -key ca.key -out ca.csr -config ca.cnf

# 查看 CA 证书请求文件内容
openssl req -in ca.csr -noout -text

# 3.创建 CA 证书,有效期10年
# 方式1.创建 CA 证书请求文件没有 SAN 配置,所以可按照下述命令,创建扩展配置文件(ca.ext) ,并在生成证书文件时指定扩展配置文件路径
cat > ca.ext << EOF
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
openssl x509 -req -sha256 -days 3650 -key ca.key -in ca1.csr -out ca1.crt -extfile v3.ext

# 方式2.直接使用配置方式生成带有 SAN 配置的 CA 证书
openssl x509 -req -sha256 -days 3650 -key ca.key -in ca.csr -out ca.crt -extfile ca.cnf -extensions v3_ca
# Certificate request self-signature ok
# subject=C = CN, ST = Chongqing, L = Chongqing, O = WeiyiGeek, OU = root, CN = ca.weiyigeek.top

# 4.查看 CA 证书内容
openssl x509 -in ca.crt -noout -text

  • 步骤 02. 使用 CA 颁发 Nginx 服务端证书 (server.weiyigeek.top)
# 1.创建 Nginx 服务端私钥文件
openssl genrsa -out server.key 2048

# 2.创建 Nginx 服务端证书请求文件
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.创建服务端证书扩展配置 (server.ext)
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 签发 Nginx 服务端证书
openssl x509 -req -sha256 -days 365 \
  -in server.csr \
  -CA ca.crt -CAkey ca.key \
  -CAcreateserial \
  -out server.crt \
  -extfile server.ext

# 5.查看 CA 证书内容
openssl x509 -in server.crt -noout -text

# 6.验证签发的证书是否正确
openssl verify -CAfile ca.crt server.crt
# server.crt: OK

图片.pngweiyigeek.top-查看颁发的Nginx服务端图

  • 步骤 03. 使用 CA 颁发 Client 服务端证书 (client.weiyigeek.top)
# 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.创建客户端证书扩展配置 (client.ext)
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
# Certificate request self-signature ok
# subject=C = CN, ST = Chongqing, L = Chongqing, O = WeiyiGeek, OU = Client Department, CN = client.weiyigeek.top

# 5.查看 CA 证书内容
openssl x509 -in client.crt -noout -text

# 6.验证签发的证书是否正确
openssl verify -CAfile ca.crt client.crt
# server.crt: OK

# 7.根据证书密钥与公钥生成为p12格式证书,它是一对公私钥的合体文件,通常会有密码保护,文件扩展名为 .p12 /.fpx 格式。
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.pfx

# 8.若需要将证书转换为 Java 的 keystore 格式可利用 keytool 工具进行转换,命令如下:
keytool -importkeystore -srcstoretype PKCS12 -srckeystore client.p12 -srcstorepass 123456 -srcalias clienttest -deststoretype JKS -destalias clienttest -deststorepass 123456 -destkeypass 123456 -destkeystore client.jks

温馨提示:由于后续需要演示 Nginx 反向代理中与上游服务端SSL双向认证,这里便使用同一个 CA 颁发客户端证书,并为其添加额外的域名和IP地址。


  • 步骤 04. 使用 CA 颁发上游 app 服务端证书 ( app1.weiyigeek.top,app2.weiyigeek.top )
# 1.创建上游 app 端私钥文件
openssl genrsa -out app.key 2048

# 2.创建上游 app 端证书请求文件
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.创建上游 app 端证书扩展配置 (app.ext)
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
# Certificate request self-signature ok
# subject=C = CN, ST = Chongqing, L = Chongqing, O = WeiyiGeek, OU = App Server, CN = app.weiyigeek.top

# 5.查看 CA 证书内容
openssl x509 -in app.crt -noout -text

好了,后续将上述生成的证书文件拷贝到 Nginx 安装目录 /usr/local/nginx 下的 certs 目录中,后续将演示如何在 Nginx 中使用这些证书,为了安全请注意证书权限设置为 600,命令如下: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 模块,该模块提供了网站 SSL 加密传输的支持, 默认情况 Nginx 不会构建此模块,应在执行 ./configure 编译时使用 --with-http_ssl_module 参数启用此模块,特别注意此模块需要 OpenSSL 库中的加密套件, 所以编译构建时可使用 --with-openssl 参数指定 OpenSSL 库的路径,另外为了支持 http2 协议支持,还需在编译构建时使用 --with-http_v2_module 参数。

# 下载 openssl-3.0.18 源码包 LTS 与服务器系统版本兼容性较好
$ openssl version
  # OpenSSL 3.0.12 24 Oct 2023 (Library: OpenSSL 3.0.12 24 Oct 2023)
cd /usr/local/src
wget https://github.com/openssl/openssl/releases/download/openssl-3.0.18/openssl-3.0.18.tar.gz
tar -zxvf openssl-3.0.18.tar.gz

# 编译安装 Nginx 1.29.0 版本,启用 SSL/TLS 支持
cd /usr/local/src/nginx-1.29.0/
$ ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --sbin-path=/usr/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --error-log-path=/var/log/nginx/logs/error.log --http-log-path=/var/log/nginx/logs/access.log --lock-path=/var/run/nginx.lock --modules-path=/usr/local/nginx/modules --with-http_stub_status_module --with-http_realip_module --with-http_v2_module --with-http_ssl_module --with-openssl=/usr/local/src/openssl-3.0.18 --with-cc-opt='-O2'
make && make install
图片.png
weiyigeek.top-openssl-3.0.18源码包图

在 Nginx 中配置 HTTPS 服务端单向认证主要涉及到以下几个指令,但是特别注意 ssl 指令,该指令在1.15.0版中被废弃,并在 1.25.1 版中被删除,现在是在 listen 指令中使用 ssl 参数,例如:listen 443 ssl;


指令参数

  • ssl_certificate 指令用于指定 SSL 证书文件路径,该证书包含了服务器的公钥信息,注意从1.11.0版开始,可以多次指定此指令以加载不同类型的证书,例如 RSAECDSA证书;此外只有OpenSSL 1.0.2或更高版本支持不同证书的单独证书链。
Syntax:  ssl_certificate file;
Default:  —
Context:  http, server

# 示例:
ssl_certificate     example.com.rsa.crt;
ssl_certificate     example.com.ecdsa.crt;
ssl_certificate     /usr/local/nginx/conf/cert.pem;
  • ssl_certificate_key 指令用于指定 SSL 证书私钥文件路径,该私钥与 ssl_certificate 指定的公钥通常数成对出现。
Syntax:  ssl_certificate_key file;
Default:  —
Context:  http, server

# 示例
ssl_certificate_key example.com.rsa.key;
ssl_certificate_key example.com.ecdsa.key;
  • ssl_password_file 指令用于指定包含私钥密码的文件路径,如果私钥被加密了,则需要使用此参数来提供解密私钥的密码(安全性高)。
Syntax:  ssl_password_file file;
Default:  —
Context:  http, server

# 示例,假如为前面创建的 server 证书设置了密码,则需要在此配置解密私钥的密码文件。
# 生成随机密码
PASSWORD=$(openssl rand -hex 15)
# 保存到文件
echo"$PASSWORD" > /tmp/certs/ssl_password.txt
# 使用密码加密私钥
openssl rsa -aes256 -in server.key -out server_encrypted.key -passout file:/tmp/certs/ssl_password.txt
# 查看加密后的私钥文件
openssl rsa -in server_encrypted.key -passin file:/tmp/certs/ssl_password.txt -text -noout
# 在 http server 块中配置解密私钥的密码文件
ssl_password_file /tmp/certs/ssl_password.txt;
图片.png
weiyigeek.top-为证书私钥创建密码图
  • ssl_protocols 指令用于指定支持的 SSL/TLS 协议版本,默认情况下只支持 TLSv1.2 和 TLSv1.3,这也是等保2.0 要求站点支持的协议版本,当然考虑到兼容性问题,也可以配置为 TLSv1.1 和 TLSv1.0,但不推荐使用 SSLv2/3 协议。
Syntax: ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
Default: ssl_protocols TLSv1.2 TLSv1.3;
Context: http, server
  • ssl_ciphers 指令用于指定支持的 SSL/TLS 加密套件,注意其加密套件必须是客户端支持的,否则会导致 SSL 握手失败,所以在设置时通常选择兼容性好加密套件,并且避免一些不安的加密套件,例如  MD5 以及 RC4 等.
Syntax: ssl_ciphers ciphers;
Default: ssl_ciphers HIGH:!aNULL:!MD5;
Context: http, server

# 示例:生产环境推荐加密套件,避免了一些不安全的加密套件,例如 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:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4;

温馨提示:受限于服务端 OpenSSL 版本不同,支持的加密套件也不同,可以通过 openssl ciphers 查看当前服务器支持的加密套件列表。例如:

$ openssl ciphers
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:RSA-PSK-AES256-GCM-SHA384:DHE-PSK-AES256-GCM-SHA384:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:AES256-GCM-SHA384:PSK-AES256-GCM-SHA384:PSK-CHACHA20-POLY1305:RSA-PSK-AES128-GCM-SHA256:DHE-PSK-AES128-GCM-SHA256:AES128-GCM-SHA256:PSK-AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:ECDHE-PSK-AES256-CBC-SHA384:ECDHE-PSK-AES256-CBC-SHA:SRP-RSA-AES-256-CBC-SHA:SRP-AES-256-CBC-SHA:RSA-PSK-AES256-CBC-SHA384:DHE-PSK-AES256-CBC-SHA384:RSA-PSK-AES256-CBC-SHA:DHE-PSK-AES256-CBC-SHA:AES256-SHA:PSK-AES256-CBC-SHA384:PSK-AES256-CBC-SHA:ECDHE-PSK-AES128-CBC-SHA256:ECDHE-PSK-AES128-CBC-SHA:SRP-RSA-AES-128-CBC-SHA:SRP-AES-128-CBC-SHA:RSA-PSK-AES128-CBC-SHA256:DHE-PSK-AES128-CBC-SHA256:RSA-PSK-AES128-CBC-SHA:DHE-PSK-AES128-CBC-SHA:AES128-SHA:PSK-AES128-CBC-SHA256:PSK-AES128-CBC-SHA
  • ssl_session_cache 指令用于设置存储 SSL 会话参数的缓存的类型和大小。
Syntax: ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
Default: ssl_session_cache none;
Context: http, server

# 参数说明
  off 禁用会话缓存
  none 不使用会话缓存
  builtin 使用内置缓存,默认大小为20480个会话,使用可能会导致内存碎片(不建议使用)。
  shared 使用共享内存缓存,可以指定名称和大小,以字节为单位1MB可以存储大约4000个会话(推荐)。

# 示例
ssl_session_cache shared:SSL:10m; # 大致存储 40000 个会话
  • ssl_session_timeout 指令用于设置 SSL 会话的超时时间,默认值为 5 分钟。
Syntax: ssl_session_timeout time;
Default: ssl_session_timeout 5m;
Context: http, server

# 示例
ssl_session_timeout 10m;
  • ssl_session_tickets 指令用于启用或禁用 SSL 会话票据,默认值为 on。
yntax: ssl_session_tickets on | off;
Default: ssl_session_tickets on;
Context: http, server
  • ssl_session_ticket_key 指令用于加密和解密TLS会话票证的密钥设置文件,如果必须在多个服务器之间共享相同的密钥,则必须使用该指令。
Syntax: ssl_session_ticket_key file;
Default: —
Context: http, server

# 示例
# 根据文件大小,AES 256(用于80字节密钥,1.11.8)或AES 128(用于48字节密钥)用于加密。
openssl rand 80 > ticket.key;   # 包含80或48字节的随机数据的密钥文件。
ssl_session_ticket_key /path/to/ticket.key;
  • ssl_buffer_size: 指令用于设置用于发送数据的缓冲区的大小,默认值为16k,对应于发送大响应时的最小开销。
Syntax: ssl_buffer_size size;
Default: ssl_buffer_size 16k;
Context: http, server

# 示例
# 为了尽量减少到达第一个字节的时间,使用较小的值可能是有益的,例如:
ssl_buffer_size 4k;
  • ssl_prefer_server_ciphers 指令用于指定是否优先使用服务器端支持的加密套件,默认值为 off。
Syntax: ssl_prefer_server_ciphers on | off;
Default: ssl_prefer_server_ciphers off;
Context: http, server

好了,接下来我们接入正题,来看看如何在 Nginx 中配置 HTTPS 服务端单向认证,即证书配置在服务端,客户端不需要提供证书。


示例演示

步骤 01.将生成的 server 证书和私钥,以及加密后的私钥及密码文件拷贝到 Nginx 的 /usr/local/nginx/certs/ 目录下,如下所示:

cp /tmp/certs/server.crt /tmp/certs/server.key /tmp/certs/server_encrypted.key /tmp/certs/ssl_password.txt /usr/local/nginx/certs/

步骤 02.在 Nginx 配置文件中添加 SSL 相关指令,如下所示:

tee /usr/local/nginx/conf.d/ssl_server.conf <<EOF
server {
  listen 80;
# 监听 443 端口,启用 SSL 
  listen 443 ssl;
# 虚拟主机服务器名称
  server_name server.weiyigeek.top;
  default_type text/html;

# 开起 HTTP/2 支持
  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.key;

# 加密的 SSL 证书密钥文件(根据需求选择)
  ssl_certificate_key /usr/local/nginx/certs/server_encrypted.key;
  ssl_password_file /usr/local/nginx/certs/ssl_password.txt;

# 支持的 SSL/TLS 协议版本
  ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

# 支持的 SSL/TLS 加密套件
  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:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4;

# SSL 会话缓存
  ssl_session_cache shared:SSL:10m;
# SSL 会话超时时间
  ssl_session_timeout 10m;
# 优先使用服务器端支持的加密套件
  ssl_prefer_server_ciphers on;

# 强制使用 HTTPS 访问
  add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload" always;

  location / {
    root /usr/local/nginx/html;
    index index.html;
  }
}
EOF

步骤 03.配置完成后,重启 Nginx 服务,并硬解析站点域名指向服务器 IP 地址,再使用浏览器访问 https://server.weiyigeek.top/ 测试 https 是否配置成功。

nginx -s reload

# Linux
echo '10.20.172.214 server.weiyigeek.top' >> /etc/hosts

# Windows
# C:\Windows\System32\drivers\etc\hosts
10.20.172.214 server.weiyigeek.top
图片.png
weiyigeek.top-Nginx单向SSL站点配置图

步骤 04.另外,我们还可将 ca.crt CA 证书导入到系统里的受信任的根证书颁发机构,使得浏览器不对自签证书认定为无效机构颁发证书,如下所示:

图片.png
weiyigeek.top-导入ca证书配置信任机构图

步骤 05.再次重新打开 Edge、Google Chrome、firefox 等浏览器访问 https://server.weiyigeek.top/ 测试,会发现浏览器不再提示证书不安全警告了,导航栏中都有一个图标加了🔒。

图片.png
weiyigeek.top-不再提示证书不安全警告图

至此,使用自签证书在 Nginx 中配置单向 SSL 站点以及导入 ca 证书让浏览器标识其为受信任的 https 安全站点就完成了。

END

加入:作者【全栈工程师修炼指南】知识星球

『 全栈工程师修炼指南』星球,主要涉及全栈工程师(Full Stack Development)实践文章,持续更新包括但不限于企业SecDevOps和网络安全等保合规、安全渗透测试、编程开发、云原生(Cloud Native)、物联网工业控制(IOT)、人工智能Ai,从业书籍笔记,人生职场认识等方面资料或文章。


Q: 加入作者【全栈工程师修炼指南】星球后有啥好处?

✅ 将获得作者最新工作学习实践文章以及网盘资源。

✅ 将获得作者珍藏多年的全栈学习笔记(需连续两年及以上老星球友,也可单次购买)

✅ 将获得作者专门答疑学习交流群,解决在工作学习中的问题。

✅ 将获得作者远程支持(在作者能力范围内且合规)。


获取:作者工作学习全栈笔记

作者整理了10年的工作学习笔记(涉及网络、安全、运维、开发),需要学习实践笔记的看友,可添加作者微信或者回复【工作学习实践笔记】,当前价格¥299,除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持,希望大家多多支持,收获定大于付出!


 知识推荐 往期文章


若文章对你有帮助,请将它转发给更多的看友,若有疑问的小伙伴,可在评论区留言你想法哟 💬

【声明】内容源于网络
0
0
全栈工程师修炼指南
记录全栈工程师学习之路修炼心得,分享工作实践、网络安全、运维、编程、大数据、云原生、物联网、人工智能以及书籍笔记、人生职场感悟等相关高质量文章。 花开堪折直须折,莫待无花空折枝。 Blog:【https://weiyigeek.top】
内容 589
粉丝 0
全栈工程师修炼指南 记录全栈工程师学习之路修炼心得,分享工作实践、网络安全、运维、编程、大数据、云原生、物联网、人工智能以及书籍笔记、人生职场感悟等相关高质量文章。 花开堪折直须折,莫待无花空折枝。 Blog:【https://weiyigeek.top】
总阅读31
粉丝0
内容589