我一直在解决一个晦涩的nginx问题,其中我们有一个站点可以正确提供证书并在端口443上建立ssl连接,即使未为该端口显式打开ssl。在下面,您可以看到站点的配置,该站点正在侦听端口443,但未使用ssl directive。
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会抛出一个错误,提示“普通的HTTP请求已发送到HTTPS端口。”因此,很明显,即使我们未在配置中明确定义端口443,也将此站点的端口443解释为ssl端口。对于nginx 1.7.5版和nginx 1.13.8版,此行为都是正确的。
如果未在配置中定义nginx,则nginx会使用适当的证书在端口443上为站点正确建立ssl连接的可能原因是什么?