Nginx一个IP和多个ssl证书

Nginx一个IP和多个ssl证书

示例。我有一个带有一个 IPV4 地址的 Web 服务器。我托管了大约 50 个网站,其中只有两个拥有 SSL 证书。我为 2 个 SSL 网站配置了 vhost,一切正常,但有一个大问题 - 如果我使用 https:// 前缀访问其他 48 个网站(它们没有 SSL 证书),我会看到我的最新网站拥有 SSL 证书。

是否可以在非 SSL 网站上阻止 https 前缀?或者只有一个解决方案 - 使用专用 IP 地址。如果我有专用 IP 地址,我将使用以下配置:

server {
        listen 111.222.333.444:443 ssl;
}

这样,如果我在非 SSL 网站上强制使用 https - 什么也不会发生。

答案1

Nginx 使用“默认服务器”,当没有其他最接近的匹配项时,它会选择该服务器来提供页面。如果您没有指定要使用的默认服务器,我相信它会使用它找到的第一个服务器(在您的情况下是您的 HTTPS 站点之一)。因此,您应该能够使用您的 IPv4 地址为 TLS 创建默认服务器虚拟主机(您只使用 TLS 而不再使用 SSL,对吗?)并让它监听将捕获随机 HTTPS 请求的 IP。您可能还需要在其中为您的 48 个非安全站点添加 server_name 项,但没有它也可以工作。

#Your catch-all HTTPS server:
server {
  listen 104.218.234.204:443 default_server;
  server_name ruel.in ruel.pro;
  root /var/www/ruel.pro;
  index index.html;
  ssl on;
  ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
  ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
  ssl_dhparam /etc/ssl/private/dhparams_4096.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}

#Regular HTTP server
server {
  listen ruel.in:80;
  server_name ruel.in;
  root /var/www/ruel.in;
  index index.php index.html index.htm;
  ...
}

#Regular HTTP server
server {
  listen ruel.pro:80;
  server_name ruel.pro;
  root /var/www/ruel.pro;
  index index.php index.html index.htm;
  ...
}

#Your HTTPS server
server {
  listen dallas.ruhnet.net:443 ssl;
  server_name dallas.ruhnet.net;
  ...
}

另一种选择是继续并将它们全部设置成 HTTPS!使用 Let's Encrypt 项目 (https://www.letsencrypt.org)您可以免费获得所有其他网站的可信证书。而且这很容易。

答案2

我对这个问题很熟悉。

我们基本上要不惜一切代价避免配置文件中的第一个服务器定义被用作 SSL 连接的万能服务器。我们都知道它就是这样做的(与 http 和使用 default_server 配置相反,后者工作得很好)。

这在 Nginx 中无法以声明方式实现 SSL(目前),所以我们必须使用 IF 对其进行编码...

变量$host是请求行或 http 标头中的主机名。变量$server_name是我们现在所在的服务器块的名称。

因此,如果这两个不相等,那么您为另一台主机提供了此 SSL 服务器块,因此应该被阻止。

我们可以在每个服务器块中实现这一点(当然使用通用包含)。

该代码不包含对您的服务器 IP 地址或服务器名称的特定引用,因此可以轻松地将其重新用于其他服务器配置而无需修改。

例子:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ###
    ### Section: SSL

    #
    ## Check if this certificate is really served for this server_name
    ##   http://serverfault.com/questions/578648/properly-setting-up-a-default-nginx-server-for-https
    if ($host != $server_name) {
        #return 404 "this is an invalid request";
        return       444;
    }

    # ...

相关内容