簡短版本:我在設置用於虛擬主機的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目標)鍵入到原始主機名框中。 –