为什么要监听443 default_server; Nginx规则覆盖已配置的规则(http规则正常工作)?


9

我有一个Nginx和不同的子域:

a.mydomain.com
b.mydomain.com
c.mydomain.com

Nginx有4条规则:

1)重写规则:

server {
  listen 80
  server_name gl.udesk.org;

  root /nowhere;
  rewrite ^ https://a.mydomain.com$request_uri permanent;
}

2)https规则:

server {

  listen 443;
  server_name a.mydomain.com;

  root /home/a/a/public;

  ssl on;
  ssl_certificate conf.d/ssl/a.crt;
  ssl_certificate_key conf.d/ssl/a.key;
  ssl_protocols ...
  ssl_ciphers ...
  ssl_prefer_server_ciphers on;

  location ...
}

3)http默认规则:

server {
  listen 80 default_server;
  return 444;
}

4)https默认规则:

server {
  listen 443 default_server;
  return 444;
}

因此,如果我启动nginx并:

那么,为什么nginx中的https规则配置起来如此棘手,我应该如何对其进行正确配置以使其获得与http版本相同的行为?

更新:

创建一个新证书并添加:

ssl on;
ssl_certificate conf.d/ssl/default.crt;
ssl_certificate_key conf.d/ssl/default.key;

现在可以使用,但是我可以找到不需要任何SSL证书的解决方案。只需重置除https://a.mydomain.com 以外的所有https(端口443)子域的所有连接,而无需提供证书。


2
你不能 SSL必须先获得证书,然后Web服务器才能知道所需的域。它必须具有要发送的证书,否则就无法建立与客户端进行通信的连接。
Darth Android

2
@DarthAndroid:魔术被称为SNI - en.wikipedia.org/wiki/Server_Name_Indication

@Shi我知道SNI的-这使得web服务器来接发证书,但它仍然必须选择一个证书。nginx还不够聪明,无法意识到用户不需要做什么证书。
Darth Android

Answers:


3

不要将443端口与ssl混用!Nginx完全与端口无关。您也可以通过端口80提供https。现代Nginx版本允许

listen 1234 ssl;

这样就不需要ssl on;线路了。

但是,如果要提供https,则需要指定一个证书。您的服务器将http请求重写为https请求时输入https。

您会收到协议错误,因为SSL握手先完成。所以return 444没有达到。而且任何SSL握手都需要一个证书和一个私钥,才能将加密算法与证书/私钥对一起提供给加密算法。


3

return指令是重写模块的一部分。如果您查看文档,则可能会发现它适用于请求。在HTTPS中,只能在握手完成后发出请求。

有一个功能请求:https : //trac.nginx.org/nginx/ticket/195并提供了一种解决方法。

server {
    listen 443 ssl;
    server_name bbb.example.com;
    ssl_ciphers aNULL;
    ssl_certificate /path/to/dummy.crt;
    ssl_certificate_key /path/to/dummy.key;
    return 444;
}

请注意,这将打破非SNI能力HTTPS客户端(如nginx的自己proxy_pass,除非你设置proxy_ssl_server_name on;)到达任何其他server_names(所以基本上打破了合法server_name是你们等希望让通过)。有关详细信息,请参见trac.nginx.org/nginx/ticket/195#comment:11
nh2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.