【问题标题】:CloudFlare will not let me serve only HTTPS, it works only if I serve HTTP along with HTTPSCloudFlare 不会让我只提供 HTTPS,它只有在我同时提供 HTTP 和 HTTPS 时才有效
【发布时间】:2017-03-20 02:32:08
【问题描述】:

我已经设置了一个简单的服务器来测试我的 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()

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

如果我改回这个:

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

并且访问页面不是通过域名,而是通过ip地址,我当然会收到警告,因为证书不是发给ip地址,而是我使用的域名。

如果我通过单击高级并添加异常来坚持,那么它可以工作。

所以实际上它是在端口 443 上提供服务的,但是试图通过域名访问页面,让它通过 CloudFlare DNS,然后它不起作用。

即使我只将 CloudFlare 用作“仅 DNS”,也没有关系:

或者如果我换成代理,还是一样:

我已关闭缓存并使用开发者模式,以便从我的服务器获得“实时响应”。

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

我能做什么?

【问题讨论】:

  • 请注意,“仅 DNS”模式下的 Cloudflare 不会与 HTTP(S) 交互,因为 Cloudflare 将不再代理您的流量。默认情况下,当您只输入example.com 时,浏览器会尝试http://example.com,因此除非您指定https://example.com,否则它将失败。因此,您应该在 80 上监听,重定向到 HTTPS,如果您希望第一次请求后的默认行为是 HTTPS(始终),请使用 HSTS:developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…
  • 感谢您提供有用的信息!

标签: go cloudflare


【解决方案1】:

当 Cloudflare 设置为灵活 SSL 模式时,the connection to the origin will always be over HTTP(不是 HTTPS)。

来自 Cloudflare 知识库:

您不需要在您的网络服务器上拥有 SSL 证书,但是 您的访问者仍然认为该站点启用了 HTTPS。这个选项 如果您有任何敏感信息,则不建议使用 网站。此设置仅适用于端口 443->80,不适用于 我们支持的其他端口,如 2053。它只能用作最后一个 如果您无法在自己的 Web 服务器上设置 SSL,请采取措施,但它 不如任何其他选项安全(甚至“关闭”),甚至可以 当您决定放弃它时会给您带来麻烦:我该如何解决 无限重定向循环...

要更改此设置,请转到 Cloudflare 仪表板中的 Crypto 选项卡,然后在 SSL 选项中将“灵活”更改为“完整(严格)”(如果您使用的是自签名证书,则为“完整”) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-16
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2019-10-04
    • 2010-12-14
    相关资源
    最近更新 更多