【问题标题】:SNI Dynamic CertificateSNI 动态证书
【发布时间】:2017-12-20 03:12:35
【问题描述】:

我在这里拉头发。 wix.comsquarespace.com ...等网站;可以动态生成网站,并且仍然在数百万个自定义域中的每一个上使用 SSL。

我尝试做同样的事情,但我不知道他们是如何做到的!?

合理的解决方案是在 Apache 上:

<IfModule mod_ssl.c>
            <VirtualHost *:443>
                    ServerAlias *
                    UseCanonicalName Off

                    DocumentRoot /var/www/html

                    SSLEngine on
                    SSLCertificateFile /etc/apache2/ssl/%0/server.crt
                    SSLCertificateKeyFile /etc/apache2/ssl/%0/server.key
            </VirtualHost></IfModule>

但是当我重新启动 apache 时出现错误:SSLCertificateFile: file '/etc/apache2/ssl/%0/server.crt' does not exist or is empty

即使我创建了一个带有一些虚拟证书的虚拟文件夹 /ssl/%0/...它仍然使用了(错误的)虚拟证书。

我知道有些人会大发雷霆,大喊您无法在 TLS 握手之前解析服务器名称。 但是根据这个post和其他的:%0可以用mod_vhost_alias解析,因为服务器名是用SNI发送的...

我知道这可行:第二种方法是为每个自定义域创建一个虚拟主机:

  <VirtualHost *:443>
                    ServerName site111.ca
                    ServerAlias www.site111.ca

                    DocumentRoot /var/www/html

                    SSLEngine on
                    SSLCertificateFile "/var/app/s3/ssl/site111.ca/certificate.crt"
                    SSLCertificateKeyFile "/var/app/s3/ssl/site111.ca/certificate.key"
                    SSLCertificateChainFile "/var/app/s3/ssl/site111.ca/certificate.chain"
            </VirtualHost><VirtualHost *:443>
     ServerName site222.ca
         ServerAlias www.site222.ca
     DocumentRoot /var/www/html

      SSLEngine on
      SSLCertificateFile "/var/app/s3/ssl/site222.ca/certificate.crt"
      SSLCertificateKeyFile "/var/app/s3/ssl/site222.ca/certificate.key"
      SSLCertificateChainFile "/var/app/s3/ssl/site222.ca/certificate.chain"

我可以创建一个脏系统,在其中我为每个新域添加一个虚拟主机并每天重新加载 apache Eeewwww...再次:Apache 将虚拟主机的数量限制为 256:/

他们是怎么做到的!?还有其他技术可以帮助我吗? Nginx,Nodejs? 感谢您的宝贵时间。

【问题讨论】:

  • 您为什么认为这需要成为静态服务器配置的一部分?您可以创建一个匹配通配符的配置,然后在您的应用程序中使用例如 HTTP_HOST 来决定要提供哪种资源。另外,是什么让您认为他们为每个站点使用不同的证书而不仅仅是通配符证书?
  • 感谢您的快速回答@SteffenUllrich。你能扩展你的想法吗?我不明白。 HTTPS 需要在应用程序访问之前解析,所以你的意思是:“你可以创建一个匹配通配符的配置,然后在你的应用程序中使用例如 HTTP_HOST”?另外,我可以让:site111.mysite.com 工作没问题,但我尝试让 site111.com、site222.com 工作。也许我们彼此交谈:)
  • 它仅在您可以使用通配符证书时才有效,即 *.mysite.com 是可能的,但 *.com 不是。但这也不是其他网站提供的,不是吗?
  • @SteffenUllrich 实际上这正是他们提供的。如果您有 site111.com,site222.com 说除了 site111.wix.com 和 site222.wix.com 之外,Wix 还将托管这些域,这很容易做到。我正在寻找解决这个问题的方法。
  • uwsgi with python 为我想要的提供了一个平台......还有其他选择吗? uwsgi-docs.readthedocs.io/en/latest/…

标签: apache ssl dynamic ssl-certificate sni


【解决方案1】:

我尝试做同样的事情,但我不知道他们是怎么做的!?

为了即时生成 SSL 网站,他们使用 Letsencrypt 证书颁发机构,您可以自行检查(例如:CN = www.thefoodmarketchiswick.com)。但是对于以 .wix.com 名称托管的网站,它们只是使用通配符证书( CN = *.wix.com )。到那时,很容易。

第二个问题,正如您提到的,Apache 无法处理如此庞大的托管(而且没有人相信您可以在一台服务器上托管数百万个应用程序)。看看这个Netcraft Survey,它提供了一些线索。我无法为他们回答,但运行 openssl s_client 会出错,这意味着他们没有做非常合规的事情。

【讨论】:

    【解决方案2】:

    TL;DR:他们使用通配符证书。所以问题在证书级别和服务器配置级别都得到了解决,而不仅仅是像您尝试做的那样在服务器配置级别。

    几点:

    • The logical solution - 我在计算机科学或软件工程中几乎看不到任何“合乎逻辑”的东西。这是工程,而不是数学,你必须做一些事情,而不是思考一些事情。所以在很多情况下(不是全部)知识变得比智力更重要。

    • 关于 SNI,您有一个正确的观点 - 它是将主机识别机制推回 TCP/SSL 层(在 HTTP 标头可用的 HTTP 之前)。

    • virtualhost for every custom domain - 根据我们所说的规模,它可以工作。但是,如果您载入具有 200、1000、5000 - 子域的客户端。然后呢?

    • How do they do it - 让我举个例子:像 cloudflare 这样的 HTTP 代理会为您生成一个免费证书,您必须在服务器上添加该证书(PROXY->ORIGIN 加密)并且 END_USER -> CLOUDFLARE 连接已加密使用通配符证书。这些是他们为我颁发的通配符证书的 DNS 名称:

    缩写:

    DNS Name=sni178747.cloudflaressl.com
    DNS Name=*.9992924.com
    DNS Name=*.apum.de
    DNS Name=*.arbomedia.net
    DNS Name=*.australiacasinobonus.net
    DNS Name=*.auto-lpg.de
    DNS Name=*.autoprof.de
    DNS Name=*.circuitodesafio.com.br
    DNS Name=*.data--center.info
    DNS Name=*.devclub.com
    DNS Name=*.eissportanlagen.de
    DNS Name=*.entrepreneur-hebdo.fr
    DNS Name=*.environmentalbrasil.com.br
    DNS Name=*.gofitnessplan.fr
    DNS Name=*.golfinterieur.info
    DNS Name=*.greenbuch.cf
    DNS Name=*.mindaugas.cf
    DNS Name=*.mp3fdm.trade
    DNS Name=*.mp3freedom.info
    DNS Name=*.mp3star.cricket
    DNS Name=environmentalbrasil.com.br
    DNS Name=gofitnessplan.fr
    DNS Name=golfinterieur.info
    DNS Name=greenbuch.cf
    DNS Name=mindaugas.cf
    DNS Name=mp3fdm.trade
    DNS Name=mp3freedom.info
    DNS Name=mp3star.cricket
    DNS Name=preussische-geschichte.de
    
    • 这种服务器的配置如何?它实际上是一个服务器场,在负载均衡器下,具有共享资源(具有缓存的单独调整的机器上的静态资源)。每个服务器上有多个虚拟主机/域/主机别名,但其中许多(或全部,取决于规模)只有 1 个 SSL 文件。域可以有专门的配置,如果它们的配置相同,它们可以组合在一起。

    • 关于网络服务器建议 - 除非有充分的理由使用 APACHE,否则我不会使用它。 nginx 越来越受欢迎是有原因的。

    【讨论】:

      猜你喜欢
      • 2012-03-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      相关资源
      最近更新 更多