2017-02-20 112 views
1

简短版本:我在设置用于虚拟主机的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.htmlerror.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站点的不同证书。

所有这些东西都起来了,现在就住。

+1

我倾向于认为这将证明是[Amazon AWS 307响应和永久重定向到HTTPS]的副本(http://stackoverflow.com/ a/28595295/1695906) - 您已经在您的基本域上配置了HSTS,并且*浏览器*似乎将其扩展到子域。该服务没有这样做。它不能,因为Web站点托管桶无法在没有CloudFront帮助的情况下执行HTTPS。 –

+0

这看起来很有希望!我的nginx服务器没有配置Strict-Transport-Security头,但它肯定会解释行为。此外,为什么curl可以获取index.html页面,但浏览器不能。我正在阅读HSTS。看来这将是一件好事吗?由于我要将S3存储桶放在支持TLS的CloudFront之后,我应该继续前进吗?我认为从http开始会更简单,也许会导致问题。 –

+1

原则上,您是对的,先尝试更简单的配置,但在这种情况下,可能会使事情变得复杂。我怀疑你必须在某个时候配置HSTS,因为这会发生。浏览者在看到它时会记住该标志。另请注意,使用CloudFront时,当为存储网站配置存储区时,[不要从下拉列表中选择存储区名称](http://stackoverflow.com/a/34065543/1695906)。将网站端点主机名(您当前的CNAME目标)键入到原始主机名框中。 –

回答

1
  • 您是否指定index.html作为索引文件?
  • 另外推荐的方式来设置自定义DNS的桶是使用类型A记录与别名类型。在别名目标放s3-website-us-east-1.amazonaws.com.

P.S.关于SSL,s3不提供带有自定义DNS的网站的ssl,唯一的选择是在前面添加CloudFront。

P.S.清除浏览器缓存或尝试进入无痕模式: enter image description here

+0

干杯。我确实指定了index.html。正如你所建议的,我使用s3端点将其从CNAME更改为A别名(作为建议弹出),但现在它已超时。我注意到,当我尝试wget hello.idoimaging.com时,它说“由于HSTS策略而转换为HTTPS的URL”,这可能与https问题有关吗?如果我直接连接到S3存储桶端点,它将保留在http中。 –

+0

它为我工作:http://hello.idoimaging.com/ –

+0

我看到你它留下http和工作。对于我从CNAME更改为别名后,它仍强制为https,并仍然超时。我正在尝试从隐身/清除缓存。 –