CloudFlare不允许我仅提供HTTPS,只有在我提供HTTP和HTTPS

时间:2017-03-20 02:32:08

标签: go cloudflare

我已经设置了一个简单的服务器来测试我的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.comhttps://example.com来访问我的网站,则两者都可以。

如果我发表评论go serveHTTP()并尝试将HTTP重定向到HTTPS,请执行以下操作:

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

然后我在屏幕上看到了这个:

enter image description here

如果我改回来:

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

并且不是通过域名访问页面,但是虽然是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

总而言之,由于我通过CloudFlare获得了DNS,因此CloudFlare不允许我在没有HTTP的情况下提供HTTPS。我需要HTTP和HTTPS,没有HTTP重定向。这真的很奇怪,我不知道如何解决这个问题。服务器通过443服务,因为正如我所示,如果我尝试通过IP地址访问页面并添加安全性异常,则实际上正在提供该页面。

我该怎么办?

1 个答案:

答案 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”)

Cloudflare SSL Modes