AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 583136
Accepted
blacksoul
blacksoul
Asked: 2014-03-20 06:08:17 +0800 CST2014-03-20 06:08:17 +0800 CST 2014-03-20 06:08:17 +0800 CST

虚拟主机和 SSL 之间的 Nginx 问题

  • 772

我在同一个 IP 中有两个站点,配置如下:

  • site1.com
    • 多个子域(即:foo.site1.com、bar.site1.com)
    • 一切都在端口 80 上侦听,443 中没有任何东西

  • site2WithSSL.com
    • 监听端口 80 和 443 (SSL)

我可以毫无问题地访问https://site2WithSSL.com和http://site1.com 。当有人想访问https://site1.com时,问题就出现了,nginx 用 site2WithSSL.com 回答我想避免这种情况。我的意思是,每当有人访问https://site1.com时,都不需要返回任何内容,或者只需重定向到https ://

配置是:

server {
     listen      80;
     server_name    *.site1.com;

     // ...
}

server {
     server_name www.site2WithSSL.com;
     return 301 $scheme://site2WithSSL.com$request_uri;
}

server {
     listen 80;
     listen 443 ssl;
     server_name site2WithSSL.com;
     ssl_certificate site2WithSSL.crt;
     ssl_certificate_key site2WithSSL.key;

     // ...
 }

已解决:为每个站点使用不同的 ip

nginx
  • 3 3 个回答
  • 3957 Views

3 个回答

  • Voted
  1. Best Answer
    Daniel Farrell
    2014-03-20T12:51:40+08:002014-03-20T12:51:40+08:00

    您的问题是 SSL 不支持同一 IP 上的多个虚拟主机。

    当 NGINX 通过 HTTP/1.1 接收到新连接时,请求包含一个 HOST 标头,指定要服务的虚拟主机(这是 1.1 中的重大变化,并允许我们今天所知道的虚拟主机)。

    但是使用 HTTPS,标头是加密的,并且必须建立密钥交换和 TLS 层才能解密。换句话说,在发送 SSL 证书之前,nginx 无法选择正确的 SSL 服务器块。

    您可以在 site2 的配置下添加匹配 site1 的域名的重定向,但用户仍然会收到一条消息说证书无效,所以这不是很可口。

    您可以使用一些多域证书,但需要付费。

    最简单的,并且对于您想要的配置,可能是最好的选择,是为每个站点使用不同的 IP 地址。不同的 NGINX 服务器配置可以绑定到不同的地址,因此永远不会有关于哪个是哪个的问题。大多数提供商可以为您提供多个 IP 地址,有些甚至多个块,当然在云中您可以提供更多。

    更新:SNI 通过将 Host 标头移到加密有效负载之外来解决此问题,并且受现代浏览器支持。

    • 3
  2. Steffen Ullrich
    2014-03-20T12:03:00+08:002014-03-20T12:03:00+08:00

    不可能只为一个站点侦听同一 IP 上的端口 443,因为它只知道客户端想要从 SSL 客户端 Hello 获得哪个站点。收到 Hello 后,它可以选择完成 SSL 握手或切断连接。在第一种情况下,您需要提供证书,在后一种情况下,客户端将收到一些关于 SSL 连接断开的无用错误。

    最后归结为以下选项:

    • 切断连接并在客户端引起一些奇怪的错误消息(我不知道您是否可以使用 nginx 启用此行为)。
    • 提供与 site2WithSSL.com 相同的证书,并将客户端重定向到 http-only。不幸的是,重定向将在 SSL 握手之后完成,并且此 SSL 握手将在客户端导致错误,因为主机名与证书不匹配。
    • 为 site1 使用自签名证书并重定向到 http-only:同样的问题,因为客户端不会接受证书。
    • 为 site1 使用真实证书,即使您仅使用它来重定向到 http-only。

    只有最后一个选项在客户端不会出现任何错误。

    • 2
  3. Dolanor
    2014-11-09T08:34:50+08:002014-11-09T08:34:50+08:00

    我正在考虑在没有 ssl 的情况下监听端口 443 的 site1.com 的配置,它只重定向到http://site1.com。我认为它应该可以在不需要新的 IP 地址的情况下工作。

    • 0

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve