我已经设置了一个简单的服务器来测试我的TLS证书,TLS部分工作正常。我通过CloudFlare获得了DNS。
我希望网站保持匿名,所以我只是将域名更改为“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.com
和https://example.com
来访问我的网站,则两者都可以。
如果我发表评论go serveHTTP()
并尝试将HTTP重定向到HTTPS,请执行以下操作:
// go serveHTTP()
go redirectHTTP()
serveHTTPS()
然后我在屏幕上看到了这个:
如果我改回来:
// go serveHTTP()
// go redirectHTTP()
serveHTTPS()
并且不是通过域名访问页面,但是虽然是ip地址,但是我当然会收到警告,因为证书没有发给ip地址,而是我使用的域名。
如果我通过点击高级并添加例外来坚持,那么它可以正常工作。
所以实际上它是在端口443上提供服务,但尝试通过域名访问该页面,让它通过CloudFlare DNS,然后它不起作用。
即使我只使用CloudFlare作为“仅限DNS”,它仍然无关紧要:
或者如果我改为代理,仍然是相同的:
我已关闭缓存,我使用开发人员模式,以便从服务器获取“实时响应”。
总而言之,由于我通过CloudFlare获得了DNS,因此CloudFlare不允许我在没有HTTP的情况下提供HTTPS。我需要HTTP和HTTPS,没有HTTP重定向。这真的很奇怪,我不知道如何解决这个问题。服务器通过443服务,因为正如我所示,如果我尝试通过IP地址访问页面并添加安全性异常,则实际上正在提供该页面。
我该怎么办?
答案 0 :(得分:0)
当Cloudflare设置为灵活SSL模式时,the connection to the origin will always be over HTTP(不是HTTPS)。
来自Cloudflare KB:
您的Web服务器上不需要SSL证书,但是 您的访问者仍然将该网站视为启用了HTTPS。这个选项 如果您有任何敏感信息,不建议使用 网站。此设置仅适用于端口443-> 80,而不适用于端口443-> 80 我们支持的其他端口,如2053.它应该只用作最后一个 如果您无法在自己的Web服务器上设置SSL,那就去度假 不如任何其他选项(甚至“关闭”)安全,甚至可以 当你决定转离它时会导致麻烦:我该如何解决 无限重定向循环......
要更改此设置,请转到Cloudflare仪表板中的加密选项卡,然后在SSL选项中将“Flexible”更改为“Full(Strict)”(如果您使用的是自签名证书,则更改为“Full”)