简短版本:我在设置用于虚拟主机的AWS S3存储桶的静态网站上收到https错误,但未收到https。它位于指向我的AWS Route 53托管区域上的S3存储桶的CNAME记录中,其中A记录转到其他站点,该站点使用https。子网域上的AWS S3静态网站上的https错误
龙版本:
我在上AWS EC2实例我的顶点URL(idoimaging.com
)主办的Rails站。我希望独立于此,将博客作为静态网站(Jekyll)作为子域blog.idoimaging.com
进行托管。
要测试一个简单的设置,我尝试了一个最小的静态子域名网站hello.idoimaging.com
。我制作了一个名为hello.idoimaging.com
的测试存储桶,并在其中放入了小型文件index.html
和error.html
。我启用了网站在桶性质的托管,并增加了读取所有政策桶:
{
"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/*"
}
]
}
我可以直接在其端点hello.idoimaging.com.s3-website-us-east-1.amazonaws.com访问桶,我看到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.
起初,当我试图访问hello.idoimaging.com我刚刚得到一个超时。我读了一篇关于右键点击存储桶中的对象“公开”的帖子。这听起来并不合适,因为我认为这是桶政策的目的,但是当我尝试时,我得到了改变。在权限下,我现在有受让人:每个人都没有权限打开/下载,尽管它仍然无法正常工作,但现在我得到HTTPS安全错误,而不是超时。所以看起来'公开'(我以前从未使用过)会有所作为。进展,我猜?
使用curl我可以获取hello.idoimaging.com
并检索index.html
文件,无后顾之忧,即使我使用HTTPS --proto。然而,wget和任何浏览器都不会。
到hello.idoimaging.com
的所有请求,现在被迫https://开头,这是与失败“您的连接不是私人” /“这个网站使用HTTP严格传输安全(HSTS)”,并在不同的浏览器的各种不同的消息。这种force-to-https行为是否正常?我问的原因是我的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站点的不同证书。
所有这些东西都起来了,现在就住。
我倾向于认为这将证明是[Amazon AWS 307响应和永久重定向到HTTPS]的副本(http://stackoverflow.com/ a/28595295/1695906) - 您已经在您的基本域上配置了HSTS,并且*浏览器*似乎将其扩展到子域。该服务没有这样做。它不能,因为Web站点托管桶无法在没有CloudFront帮助的情况下执行HTTPS。 –
这看起来很有希望!我的nginx服务器没有配置Strict-Transport-Security头,但它肯定会解释行为。此外,为什么curl可以获取index.html页面,但浏览器不能。我正在阅读HSTS。看来这将是一件好事吗?由于我要将S3存储桶放在支持TLS的CloudFront之后,我应该继续前进吗?我认为从http开始会更简单,也许会导致问题。 –
原则上,您是对的,先尝试更简单的配置,但在这种情况下,可能会使事情变得复杂。我怀疑你必须在某个时候配置HSTS,因为这会发生。浏览者在看到它时会记住该标志。另请注意,使用CloudFront时,当为存储网站配置存储区时,[不要从下拉列表中选择存储区名称](http://stackoverflow.com/a/34065543/1695906)。将网站端点主机名(您当前的CNAME目标)键入到原始主机名框中。 –