NGINX 中是否按顺序使用多个 TLS 证书/密钥?在这种情况下,NGINX 如何确定最佳匹配?

NGINX 中是否按顺序使用多个 TLS 证书/密钥?在这种情况下,NGINX 如何确定最佳匹配?

使用 Cloudflare 的“完整”加密模式,可以使用自签名证书进行源到 Cloudflare 的连接:

源提供的证书不会以任何方式进行验证。它可能已过期、自签名,甚至没有与请求的主机名匹配的 CN/SAN 条目。

--https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/full/

最近,我使用以下命令(GNU/Linux)制作的自签名证书停止工作,Cloudflare 抛出了526 错误

openssl genpkey -algorithm Ed25519 -out /etc/ssl/qycli.key
openssl req -new -x509 -key /etc/ssl/qycli.key -out /etc/ssl/qycli.crt -days 7300 -subj "/C=AQ/ST=qycli/L=qycli/O=HOSTYON/OU=SysOps/CN=HOSTYON"

使用以下证书和密钥可以使与 Cloudflare 的连接再次正常:

openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -x509 -nodes -days 7300 -out /etc/ssl/qycli.crt -keyout /etc/ssl/qycli.key -subj "/C=AQ/ST=qycli/L=qycli/O=HOSTYON/OU=SysOps/CN=HOSTYON"

我是否可以指定多个证书和密钥,以便 NGINX 按顺序一个接一个地考虑它们,以尽可能保持较高的性能,同时在 Cloudflare 认为证书和密钥不再足够安全时提供后备?

NGINX 文档提到:

自 1.11.0 版本起,可以多次指定此指令以加载不同类型的证书,例如 RSA 和 ECDSA:

--https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate

以下操作会按照我预期的那样工作吗?

server {
listen              443 ssl;
server_name         example.com;

ssl_certificate     /etc/ssl/qycli.crt; # More performant, less secure ECDSA P-256 certificate
ssl_certificate_key /etc/ssl/qycli.key;

ssl_certificate     /etc/ssl/qycli.2048.crt; # More performant, less secure RSA 2048 fallback certificate
ssl_certificate_key /etc/ssl/qycli.2048.key;

ssl_certificate     /etc/ssl/qycli.384.crt; # Less performant, more secure ECDSA P-384 fallback certificate
ssl_certificate_key /etc/ssl/qycli.384.key;

ssl_certificate     /etc/ssl/qycli.4096.crt; # More performant, less secure RSA 4096 certificate
ssl_certificate_key /etc/ssl/qycli.4096.key;
...
}

使用以下方式制作的证书和密钥:

# ECDSA
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -x509 -nodes -days 7300 -out /etc/ssl/qycli.crt -keyout /etc/ssl/qycli.key -subj "/C=AQ/ST=qycli/L=qycli/O=HOSTYON/OU=SysOps/CN=HOSTYON"
openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:secp384r1 -x509 -nodes -days 7300 -out /etc/ssl/qycli.384.crt -keyout /etc/ssl/qycli.384.key -subj "/C=AQ/ST=qycli/L=qycli/O=HOSTYON/OU=SysOps/CN=HOSTYON"
# RSA
openssl req -x509 -newkey rsa:2048 -keyout /etc/ssl/qycli.2048.key -out /etc/ssl/qycli.2048.crt -sha256 -days 7300 -nodes -subj "/C=AQ/ST=qycli/L=qycli/O=HOSTYON/OU=SysOps/CN=HOSTYON"
openssl req -x509 -newkey rsa:4096 -keyout /etc/ssl/qycli.4096.key -out /etc/ssl/qycli.4096.crt -sha256 -days 7300 -nodes -subj "/C=AQ/ST=qycli/L=qycli/O=HOSTYON/OU=SysOps/CN=HOSTYON"

答案1

是的,多个ssl_certificate&ssl_certificate_key对就可以了。nginx 将发送客户端要求的任何可用内容,例如,如果您支持 TLS1.2,则客户端可以选择限制服务器可以提供的证书类型的密码:

# openssl s_client -tls1_2 -cipher HIGH+aECDSA -connect server.example:443 -showcerts </dev/null
..
s:CN = server.example
a:PKEY: id-ecPublicKey
..

# openssl s_client -tls1_2 -cipher HIGH+aRSA -connect server.example:443 -showcerts </dev/null
..
s:CN = server.example
a:PKEY: rsaEncryption
..

当有多个选择时,可以使用nginx 设置ssl_ecdh_curve覆盖客户端偏好。但默认行为应该已经满足了您的目标,即让 Cloudflare 从他们认为合适的内容中进行选择 - 前提是您使用的是非弃用(openssl)库。


但是,对于只与一个特定云提供商通信的端点,您可能根本不想提供多个选择。选择一个被认为受支持、安全且性能良好的云提供商可能会以较低的维护成本解决问题。直到全部其中的一些被认为不再合适,可能在未来的同一时间。

相关内容