Amazon web services 子域上AWS S3静态站点上的https错误

Amazon web services 子域上AWS S3静态站点上的https错误,amazon-web-services,amazon-s3,https,Amazon Web Services,Amazon S3,Https,简短版本:我在AWS S3 bucket上的静态网站上收到https错误,该bucket是为web托管而设置的,但不是https。它由一条CNAME记录定位,该记录指向我的AWS Route 53托管区域上的S3 bucket,其中a记录指向另一个使用https的站点 长版本: 我在AWS EC2实例上的apex url(idoimaging.com)上托管了一个Rails站点。独立于此,我希望将博客作为静态站点(Jekyll)作为子域blog.idoimaging.com托管 为了使用简单的设

简短版本:我在AWS S3 bucket上的静态网站上收到https错误,该bucket是为web托管而设置的,但不是https。它由一条CNAME记录定位,该记录指向我的AWS Route 53托管区域上的S3 bucket,其中a记录指向另一个使用https的站点

长版本:

我在AWS EC2实例上的apex url(
idoimaging.com
)上托管了一个Rails站点。独立于此,我希望将博客作为静态站点(Jekyll)作为子域
blog.idoimaging.com
托管

为了使用简单的设置进行测试,我尝试创建一个最小的静态子域站点
hello.idoimaging.com
。我制作了一个名为
hello.idoimaging.com
的测试bucket,并在其中放入了小的
index.html
error.html
文件。我在bucket属性中启用了网站托管,并在bucket中添加了“全部读取”策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Allow Public Access to All Objects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::hello.idoimaging.com/*"
        }
    ]
}
我可以在bucket的端点直接访问它,并看到index.html页面。到目前为止一切都很好

现在我想设置一个CNAME,这样我就可以访问静态站点
hello.idoimaging.com
。在AWS Route 53中,我为我的
idoimaging.com
域创建了一个托管区域,在该域中我创建了一个名为“
hello.idoimaging.com
”和值为“
hello.idoimaging.com.s3-website-us-east-1.amazonaws.com
”的CNAME

挖掘结果看起来不错:

$ dig hello.idoimaging.com
...
;; QUESTION SECTION:
;hello.idoimaging.com.      IN  A
...
;; ANSWER SECTION:
hello.idoimaging.com.   226 IN  CNAME   hello.idoimaging.com.s3-website-us-east-1.amazonaws.com.
hello.idoimaging.com.s3-website-us-east-1.amazonaws.com. 60 IN CNAME s3-website-us-east-1.amazonaws.com.
s3-website-us-east-1.amazonaws.com. 3 IN A  52.216.64.90
...
;; AUTHORITY SECTION:
s3-website-us-east-1.amazonaws.com. 1778 IN NS  ns-1133.awsdns-13.org.
s3-website-us-east-1.amazonaws.com. 1778 IN NS  ns-1919.awsdns-47.co.uk.
s3-website-us-east-1.amazonaws.com. 1778 IN NS  ns-490.awsdns-61.com.
s3-website-us-east-1.amazonaws.com. 1778 IN NS  ns-661.awsdns-18.net.
起初,当我试图访问时,我只是得到了一个超时。我在某处读到一篇关于右键单击桶中对象的“公开”的帖子。我觉得这听起来不太对,因为我认为这就是桶政策的目的,但当我尝试它时,我得到了一个改变。在Permissions下,我现在有了Grantee:Everyone和权限Open/Download,虽然它仍然不起作用,但现在我得到了一个HTTPS安全错误,而不是超时。因此,“公开”(我以前从未使用过)似乎起了作用。我想是进步吧

使用curl,我可以获取
hello.idoimaging.com
,它检索
index.html
文件,不用担心,即使我使用--proto-https。然而,wget和任何浏览器都不会

现在,所有对
hello.idoimaging.com
的请求都被强制使用https://,这是由于“您的连接不是私有的”/“此站点使用HTTP严格传输安全(HSTS)”和不同浏览器上的各种不同消息而失败的。这种强迫行为正常吗?我问这个问题的原因是,我的apex站点位于nginx服务器中,它将http请求重定向到https。但是如果我请求
hello.idoimaging.com
DNS将获取我的S3站点的CNAME,而不是apex站点的A记录,对吗?看来他们没什么关系。apex站点由letsencrypt.org提供的本地证书进行保护

一旦我开始这样做,我想使用CloudFront,但我现在在使用S3站点时遇到了足够多的困难

问题似乎是由于对
hello.idoimaging.com
(键入的内容与此相同)的请求被强制使用https而导致的,而这是失败的。寻求建议。如果我的apex站点是https而子域不是https存在问题,那么我似乎要通过尝试在子域上设置https使问题复杂化,因为它将使用不同于apex站点的证书

所有这些东西现在都可以使用了。

  • 您是否指定
    index.html
    作为索引文档
  • 另外,为bucket设置自定义DNS的推荐方法是使用类型A记录和别名类型。在别名target put
    s3-website-us-east-1.amazonaws.com.
关于SSL,s3不为具有自定义DNS的网站提供SSL,唯一的选择是在前面添加CloudFront

另外,请清除浏览器的缓存,或在匿名模式下尝试:

为此干杯。我确实指定了index.html。正如您所建议的,我使用s3端点将CNAME更改为别名(作为建议弹出),但现在它超时了。我注意到当我尝试wget hello.idoimaging.com时,它说“由于HSTS策略,URL转换为HTTPS”,这可能与HTTPS问题有关吗?如果我直接连接到S3 bucket端点,它将保持在http中。我看到它保持在http中并且工作正常。对我来说,从CNAME改为别名后,它仍然强制使用https,并且仍然超时。我正在尝试从匿名/清除缓存。我在响应中看不到严格的传输安全标头。。。事实上,s3不支持HST,根据:这是对我的误导-是我的apex站点运行nginx,可能是从HST开始的(我刚刚了解到),尽管我在配置中没有看到严格的传输安全性@Michael sqlbot在上面的注释让我相信浏览器正在缓存主站点的HST并将其扩展到子域。这可能解释了为什么你可以访问子域,而从来没有访问过顶级域。工作仍在继续…我倾向于相信这将被证明是一个复制品--您已经在基本域上配置了HST,而且浏览器似乎正在将其扩展到子域。服务没有这样做。这不可能,因为如果没有CloudFront的帮助,托管Bucket的web站点就无法使用HTTPS。这看起来非常有希望!我的nginx服务器没有配置严格的传输安全头,但它肯定会解释这种行为。还有为什么curl可以获取index.html页面,而浏览器却不能。我在读HST。这似乎是一件好事?当我将把我的S3存储桶放在支持TLS的CloudFront后面时,我应该继续吗?我认为从http开始会更简单,可能是它造成了问题。原则上,您首先尝试更简单的配置是正确的,但在这种情况下,可能会使事情复杂化。我怀疑您一定在某个时候配置了HST,这样才会发生这种情况。浏览器一旦看到该标志,就会记住它。还要注意,机智