2017-03-20 42 views
0

我已經設置了一個簡單的服務器來測試我的TLS證書,TLS部分正常工作。我通過CloudFlare擁有自己的DNS。CloudFlare不會讓我只提供HTTPS,它只適用於HTTP和HTTPS服務

我想網站保持匿名,所以我只是將域名更改爲「example.com」。

這裏是一個簡單的服務器代碼:

package main 

import (
    "log" 
    "net/http" 
) 

var hostname = "example.com" 

var key = "/srv/ssl/" + hostname + "-2017.03.20.key" 
var cert = "/srv/ssl/ssl-bundle.crt" 

func main() { 
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 
     w.Write([]byte("TLS test")) 
    }) 
    // go serveHTTP() 
    // go redirectHTTP() 
    serveHTTPS() 
} 

func serveHTTP() { 
    if err := http.ListenAndServe(":80", nil); err != nil { 
     log.Fatalf("ListenAndServe error: %v", err) 
    } 
} 

func redirectHTTP() { 
    err := http.ListenAndServe(":80", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 
     http.Redirect(w, r, "https://"+hostname+r.RequestURI, http.StatusMovedPermanently) 
    })) 
    if err != nil { 
     log.Fatalf("ListenAndServe error: %v", err) 
    } 
} 

func serveHTTPS() { 
    log.Fatal(http.ListenAndServeTLS(":443", cert, key, nil)) 
} 

現在,如果我像這樣運行的服務器,並轉到https://example.com那麼它不工作。

但是,如果我改變,讓我成爲HTTP這個部分:

go serveHTTP() 
// go redirectHTTP() 
serveHTTPS() 

然後突然HTTP和HTTPS的作品。因此,如果我通過輸入http://example.comhttps://example.com訪問我的網站,兩者都可以正常工作。

如果我註釋掉go serveHTTP(),並嘗試HTTP重定向到HTTPS是這樣的:

// go serveHTTP() 
go redirectHTTP() 
serveHTTPS() 

然後我得到這個在我的屏幕上:

enter image description here

如果我變回這樣的:

// go serveHTTP() 
// go redirectHTTP() 
serveHTTPS() 

並且訪問不是第th頁粗略的域名,但雖然ip地址,我當然會得到警告,因爲證書不是發給ip地址,而是我使用的域名。

enter image description here

如果我點擊先進並添加例外,然後它堅持。

enter image description here

因此,實際上它是被服務的端口443,而是試圖通過域名,讓它經歷的CloudFlare DNS訪問的頁面,那麼這是行不通的。

即使我只使用CloudFlare的是 「DNS只是」 它仍然沒有關係:

enter image description here

或者,如果我改變爲代理,還是一樣:

enter image description here

我已關閉緩存,並使用開發人員模式,以便從服務器獲得「實時響應」。

enter image description here

所以要summerize,因爲我有過的CloudFlare我的DNS,CloudFlare的並不讓我擔任HTTPS,沒有HTTP。我需要HTTP和HTTPS而無需HTTP重定向。這真的很奇怪,我不知道如何解決這個問題。服務器通過443服務,因爲正如我所展示的,如果我嘗試通過IP地址訪問該頁面並添加安全性異常,則該頁面實際上正在服務。

我該怎麼辦?

+0

注意的CloudFlare在「DNS只有」模式不使用HTTP(S)進行交互,如CloudFlare的將不再進行代理你的流量。默認情況下,當您僅輸入example.com時,瀏覽器將嘗試'http:// example.com',因此除非您指定'https:// example.com',否則它將失敗。因此,您應該在80上監聽,重定向到HTTPS,並且如果您希望第一個請求後的默認行爲是HTTPS(始終),請使用HSTS:https://developer.mozilla.org/en-US/docs/ Web/HTTP/Headers/Strict-Transport-Security – elithrar

+0

謝謝,這是有用的信息! – Alex

回答

0

當Cloudflare設置爲Flexible SSL模式時,the connection to the origin will always be over HTTP(不是HTTPS)。

從CloudFlare的KB:

你並不需要在你的Web服務器上的SSL證書,但 訪問者仍然可以看到該網站爲被啓用HTTPS。如果您在 網站上有任何敏感信息,建議不要使用此選項 。此設置僅適用於端口443-> 80,而不適用於我們支持的其他端口(如2053)的 。如果您無法在自己的Web服務器上設置SSL,則該設置只能用作最後一個 度假區,但它只能用作 比任何其他選擇(甚至是「關」)安全性較低,並且甚至可以 因爲你的麻煩,當你決定從它切換出來:如何解決 無限重定向循環...

爲了要更改此選項,請轉到Cloudflare儀表板中的加密選項卡,並在SSL選項中將「靈活」更改爲「完整(嚴格)」(如果您使用自簽名證書,則選擇「全部」)。

Cloudflare SSL Modes

+0

謝謝你的幫助! – Alex