是否可以设置一个服务器,它在监听端口 443 时不使用它?
类似这样的:
server {
listen 443;
server_name _;
ssl off;
return 444;
}
上述代码的问题是 nginx 强制在此块上使用 SSL(忽略ssl off
)并因缺少证书而失败。
有些人可能想知道为什么?但请将此视为我的一个学术问题:)
答案1
RFC 2818指出 HTTP/HTTPS 之间的端口分离来自于发送的第一个数据不同的事实,因为 HTTPS 在通过它发送 HTTP 之前启动 TLS 会话。
如果您没有使用正确的协议,服务器就无法理解您。
而且,RFC 7230,更新了前一个,指出:
如果端口子组件为空或未给出,则 TCP 端口 443 是默认端口,并且用户代理必须确保在发送第一个 HTTP 请求之前,通过使用强加密(端到端)来保护其与原始服务器的连接。
因此,在传输到 TCP 443 端口之前对内容进行加密是 RFC 的要求。这是无法避免的。
提出这一要求的原因是为了强制分离 OSI 层,TLS(SSL)位于第 5 层,HTTP 位于第 7 层。它们无法相互理解。这反映在软件中,这些部分的处理通常由不同的代码段完成(nginx 处理 HTTP,但将 TLS 推迟到与之链接的外部库)。