我看到的最常见的 NGINX 配置是下面的配置,它确保所有相关的 HTTP 请求都被重定向,不相关的请求被忽略,但通常我只看到一个server
块来处理 HTTPS,它主要是所有 HTTPS 请求的隐式默认服务器,不管Host
标头说什么。(提醒自己。)
我刚刚了解到,无论出于何种原因,域名都可能被解析为错误的 IP 地址,因此请求可能会到达错误的服务器(例如,1,2,3)。 根据 HTTPS 规范 (RFC 2818, “通过 TLS 进行 HTTPS”)1,必须使用服务器证书中的域名检查请求的域名(第3. 端点识别),这样不相关请求的问题就不难解决了。
我能想到的支持对不相关请求使用 HTTPS 捕获所有子句的唯一原因是为了防止客户端的 HTTPS 实现不当(这始终是安全的选择)。
[1]:位于顶部RFC 2818,它说它是“已淘汰:9110“。去那里查看更新,但我能找到的关于这个主题的唯一参考资料是在1.4. 本文档已废弃的规范重定向至部分B.1. 与 RFC 2818 的差异在附录 B. 与先前 RFC 的差异其中简单地指出:“没有任何“……”
##################
# HTTP catch-all #
##################
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 404;
}
########################## ( see other flavors:
# HTTP-to-HTTPS redirect # https://serverfault.com/questions/1141066
########################## )
server {
listen 80;
listen [::]:80;
server_name ourdomain.com;
return 301 https://ourdomain.com$request_uri;
}
#########
# HTTPS #
#########
server {
listen 443 default_server ssl http2;
ssl_certificate /path/to/signed_cert_plus_intermediates;
ssl_certificate_key /path/to/private_key;
# ... rest of the instructions ...
}
编辑 (2023-08-26):
我目前使用的 catch-all 块来自 Stackoverflow 线程捕获所有无效子域名的 nginx 服务器阻止:
#############################
# CATCH-ALL (https & https) #
#############################
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 default_server ssl;
listen [::]:443 default_server ssl;
ssl_certificate /some/path/any.crt;
ssl_certificate_key /some/path/any.key;
return 444;
# silently drop the connection
# ... or you can define some
# landing page here instead
}
自签名虚拟证书和私钥通过以下方式生成
openssl req -nodes -new -x509 -subj "/CN=localhost" \
-keyout /some/path/any.key \
-out /some/path/any.crt
答案1
是的。
server
第三个区块最好是不是“默认服务器”,因为客户端的浏览器否则会生成警告,因为服务器的证书与请求的域不匹配。
您可以在第一个服务器块中添加listen 443 ssl default_server;
- 您需要提供一个ssl_certificate
和ssl_certificate_key
您可以重复使用其他网站的凭据。客户端的浏览器仍会生成警告(这是无法避免的),但如果用户仍然点击,他们将获得返回代码而不是您的网站。