【问题标题】:Heroku SSL on root domain根域上的 Heroku SSL
【发布时间】:2011-10-05 19:18:28
【问题描述】:

我正在尝试为我的 heroku 应用设置 SSL。我正在使用基于主机名的 SSL 插件。 heroku documentation 声明如下:

Hostname based SSL will not work with root domains as it relies on CNAME 
aliasing of your custom domain names. CNAME aliasing of root domains is 
an RFC violation. 

正如预期的那样,当我使用 www 子域(即 https://www.foo.com)访问该站点时,一切正常。当我访问 https://foo.com 时浏览器会报错,因为提供的证书是针对 heroku.com 的。

我得出结论,我必须将 foo.com 的流量重定向到 www.foo.com 以解决此问题。我正在考虑以下方法:

1) 基于 DNS 的重定向

DNS 提供商 Zerigo supports 重定向 记录。我在 SO 上遇到了一个类似主题的question。我尝试了该解决方案,它仅适用于 HTTP 重定向(Zerigo 文档证实了这一点)。

我的 Zerigo 配置:

foo.com      A             x.x.x.x
foo.com      redirect      http://www.foo.com
www.foo.com  CNAME         zzz.amazonaws.com

2) 基于机架的重定向

添加一个基于机架的中间件来执行重定向。 canonical-host gem 提供了这样的支持。

use CanonicalHost do
  case Rails.env.to_sym
    when :staging     then 'staging.foo.com'
    when :production  then 'www.foo.com'
  end
end

我想知道是否有更好的解决方案(禁止切换到每月 100 美元的基于 IP 的 SSL)

【问题讨论】:

    标签: ruby-on-rails ssl heroku


    【解决方案1】:

    哇...这让我很长时间了,而且网上的一堆信息是错误的。甚至 Heroku 的文档似乎也没有表明这是可能的。

    但 Jesper J 的回答提供了一个正确方向的提示:它适用于 DNSimple 的 ALIAS 记录,我猜这是他们创建的某种新的 DNS 记录。我必须将我的 DNS 服务切换到他们才能获得这种记录类型(以前使用 EasyDNS)。

    为了澄清当我说“有效”时,我的意思是:

    • 使用您的根域在 SSL 上的整个网站
    • 没有浏览器警告
    • 使用 Heroku 的 Endpoint SSL 产品(20 美元/月)

    它适用于所有以下网址(将它们重定向到https://foo.com,没有警告)

    总结重要的部分。

    1. 将您的 DNS 移至 DNSimple(如果有人知道其他提供 ALIAS 记录的提供商,请将它们发布在 cmets 中,他们是我唯一能找到的)
    2. 正常设置 Heroku 端点 ssl https://devcenter.heroku.com/articles/ssl-endpoint
    3. 回到 DNSimple 添加一个 ALIAS 记录指向 foo.com 到您的 heroku ssl 端点,类似于 waterfall-9359.herokussl.com
    4. 另外添加一条 CNAME 记录,指向 www.foo.com 到您的 heroku ssl 端点 waterfall-9359.herokussl.com
    5. 最后在您的 rails(或其他)应用程序中进行以下设置:

    production.rb集合中

    config.force_ssl = true
    

    application_controller.rb添加

    before_filter :check_domain
    
    def check_domain
      if Rails.env.production? and request.host.downcase != 'foo.com'
        redirect_to request.protocol + 'foo.com' + request.fullpath, :status => 301
      end
    end
    

    这似乎终于奏效了!关键部分似乎是ALIAS dns 记录。如果有人知道,我很想了解更多关于它是如何工作的,以及它有多可靠/成熟。不过似乎可以解决问题。

    【讨论】:

    • Heroku 说 here “您必须在“主机名”字段中输入子域。”因为根域证书与 Heroku 的 SSL 端点不兼容。您是否创建了根域证书或类似 secure.foo.com 的东西?这会影响request.hostcheck_domain 中的检查吗?
    • 能否请您确认是否真的可以使用根证书。
    • 您能否确认您是否使用根域 foo.com 的证书?或者,您是否使用通配符证书 *.foo.com ?我正在为我的根域使用证书,但我的浏览器一直说 www.foo.com 不安全。当我关闭警告时,它会按预期重定向到 foo.com,并且在那里一切正常。
    • 我想知道application_controller 中的代码是做什么的。它会将所有内容重定向到http://foo.com/ 吗? (例如,https://www.foo.com/ 变为 https://foo.com/http://waterfall-9359.herokussl.com/ 变为 https://foo.com/)。如果是这样,如果您在应用程序中使用子域,则需要更改此代码,对吧?
    • 如果有其他人遇到此问题,我发现 TTL 必须 >= 3600 才能使此配置正常工作。在 60 岁时,Heroku 似乎返回了错误域的证书。我无法解释这种行为,但这就是让这个配置为我工作所需要的。
    【解决方案2】:

    DNSimple 提供了一种 ALIAS 记录类型来满足这一需求。您可以从指向 CNAME 的根域(又名区域顶点)创建别名。在此处阅读更多信息:

    http://blog.dnsimple.com/introducing-the-alias-record/

    【讨论】:

      【解决方案3】:

      DNS 重定向不关心入站请求是 http 还是 https,因此会保持原始协议 - 因此会将 http://foo.com 重定向到 http://www.foo.com,对于 https 也是如此。

      您需要通过您找到的 gem 或其他机架重定向 gem 在应用程序中执行此操作,或者如果 www.使用基于 IP 的 SSL 插件是个问题。

      【讨论】:

      • 根据 Zerigo 文档,DNS 重定向仅适用于 http。 zerigo.com/blog/2009/07/…。我的最终解决方案是混合两种风格。
      【解决方案4】:

      您要记住的一件事是,如果两个版本都可以访问(根与 WWW),谷歌可能会索引您网站的两个版本。您需要设置锥形来处理可能难以维护的问题。

      在我的 DNS 设置中,我设置了一个 URL / 转发记录 (DNS Simple)

      URL foo.com     3600        http://www.foo.com
      

      CNAME 设置只需要为 WWW 设置

      CNAME   www.foo.com 3600        providedsslendpoint.herokussl.com
      

      我还必须为我的根设置和别名

      ALIAS   foo.com 3600        providedsslendpoint.herokussl.com
      

      然后我决定简单地将 foo.com 替换为环境变量 ENV['SITE_HOST'](其中 SITE_HOST= www.foo.com 或我可能定义的任何内容)。我可以通过我的 heroku 配置或我的 .env 文件来控制它(参见https://github.com/bkeepers/dotenv)。这样,我可以控制在不同环境中发生的事情。

      例如,我的测试应用使用 test.foo.com 作为 url,它也有自己的 SSL 端点,所以对我来说很好用。这也可以扩展以创建临时或 QA 特定环境。

        before_filter :check_domain
      
        def check_domain
          if Rails.env.production? || Rails.env.testing? and request.host.downcase != ENV['SITE_HOST']
            redirect_to request.protocol + ENV['SITE_HOST'] + request.fullpath, :status => 301
          end
        end
      

      从现在开始,最终用户将始终使用强制 SSL 访问 www。旧链接会出现小问题,但不会引起注意。

      【讨论】:

        【解决方案5】:

        在 Rails 部分,要进行重定向,让它发生在路由器层会更明智,就像这样(适用于 Rails 3+):

        Rails.application.routes.draw do
        
          match '/*splat' => redirect { |_, request| request.url.sub('//www.', '//') }, :constraints => { :subdomain => 'www' }
        
          # ...
        
        end
        

        【讨论】:

          【解决方案6】:

          对于之前使用 godaddy 的 heroku 用户,我刚刚完成了将 DNS 从 godaddy 移植到 cloudflare。 https现在工作正常。

          Godaddy DNS 与 heroku 不兼容。这是由于:

          一些 DNS 提供商只会为根域提供 A 记录。 不幸的是,A 记录不足以指向您的根 域到 Heroku,因为它们需要静态 IP。这些记录有 在环境中使用时严重的可用性影响,例如 本地数据中心、云基础设施服务和平台 像 Heroku。由于 Heroku 使用动态 IP 地址,因此有必要 使用类似 CNAME 的记录(通常称为 ALIAS 或 ANAME 记录) 这样您就可以将您的根域指向另一个域。

          设置相当简单。

          首先,将 cloudflare 的域名服务器添加到 godaddy dns manager 中。这些是一些例子:

          roxy.ns.cloudflare.com sam.ns.cloudflare.com

          接下来,您只需要再执行两个步骤。

          1. 添加 CNAME NAME.com 并将其链接到 NAME.com.herokudns.com
          2. 就是这样。这是假设您已经有一个 CNAME www.NAME.com 链接到 www.NAME.com.herokudns.com

          如果您使用的是 Rails,请务必将 config.force_ssl = true 设置为 config/environment/production.rb

          【讨论】:

            【解决方案7】:

            我发现 DNSimple 对我目前的 Web 开发人员能力来说很复杂。我终于注册了 easyDNS,并将我在 Godaddy 购买的域名转移到了 easyDNS。标准 easyDNS 订阅的年度费用目前为 20 美元。 easyDNS 的好处是他们实际上接听了他们的电话。在电话上几分钟后,我为 Heroku 正确配置了我的 DNS 目标。测试了我的应用程序,它适用于 HTTP。当我将我的 heroku 应用程序升级到付费的爱好 dyno(目前每月 7 美元)时,它立即应用了 SSL 保护。再次在浏览器中测试我的应用程序,它可以通过 HTTP 和 HTTPS 提供服务。接下来,我在我的 nodejs 应用程序中取消了一些重定向 http => https 的代码的注释。在浏览器中再进行一次测试,看起来不错。安全的。适用于 www 并且适用于根域。底线:您可能不必以 20 美元/月的价格购买 Heroku 端点。希望对您有所帮助。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-05-13
              • 1970-01-01
              • 1970-01-01
              • 2017-12-28
              • 1970-01-01
              • 2015-02-24
              相关资源
              最近更新 更多