0

我一直在对一个晦涩的 nginx 问题进行故障排除,其中我们有一个站点正确地提供证书并在端口 443 上建立了一个 ssl 连接,即使没有为该端口明确打开 ssl。您可以在下面看到该站点的配置,该站点正在侦听端口 443 但不使用ssl 指令

server {
  listen 443;
  port_in_redirect off;
  server_name xyz.abcd.com;

  # websockets
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";

  client_max_body_size                1m;
  proxy_set_header X-Request-Id       $request_id;
  proxy_set_header X-Request-Start    $msec;
  proxy_set_header X-Forwarded-Proto  "https";
  proxy_set_header Host               $host;

  location / {
    proxy_pass http://xyz-svc;
  }
}

此外,我们的 nginx.conf 没有明确提及端口 443 或 ssl,但它确实包含 abcd.com 证书的路径:

http {
..

  ssl_certificate     /etc/ssl/certs/abcd.pem;
  ssl_certificate_key /etc/ssl/private/abcd.key;

..
}

最后,如果我们访问http://abcd.com:443,nginx 会抛出一个错误“The plain HTTP request was sent to HTTPS port”。因此,很明显,它将此站点的端口 443 解释为 ssl 端口,即使我们没有在配置中明确定义它。对于 nginx 版本 1.7.5 和 nginx 版本 1.13.8,此行为都是正确的。

如果配置中从未定义过,nginx 会在端口 443 上为具有适当证书的站点正确建立 ssl 连接的可能原因是什么?

4

0 回答 0