gpt4 book ai didi

ssl - 去 ListenAndServeTLS 握手

转载 作者:数据小太阳 更新时间:2023-10-29 03:06:03 24 4
gpt4 key购买 nike

目前。我有下面一行(效果很好)

http.ListenAndServeTLS(":"+Config.String("port"), Config.Key("https").String("cert"), Config.Key("https").String("key"), router)

当我尝试将端口设置为 443 而不是 8080 时,问题就来了。我在浏览器上收到以下错误 (Chrome)

This site can’t provide a secure connection.

www.example.com sent an

invalid response. ERR_SSL_PROTOCOL_ERROR

我不确定自己做错了什么,或者我是否不应该在端口 443 上运行服务器?

最佳答案

我能想到发生这种情况的两个原因

  • 您的服务器应用程序无权访问端口 443
  • 您的浏览器正在尝试通过端口 80 访问您的服务器

由于标记标签无法解决第一个问题,因此本答案将涵盖第二个问题。

发生此问题是因为默认情况下,当您键入 www.domain.com 之类的地址时,您的浏览器会尝试使用端口 80 上的 http 协议(protocol)联系 url 域,这是一个已知行为 Golang ListenAndServeTLS returns data when not using https in the browser

现在,如果您在浏览器中输入具有适当方案的完整 URL,例如 https://www.domain.com,浏览器将通过端口 443 访问服务器并启动 TLS 握手与您的服务器,从而呈现正确的数据。

现在,您知道这一点,但您的用户却不知道。如果您的用户每次尝试仅使用您的域作为 URL 访问您的 Web 应用程序时都收到 SSL 握手错误通知,那将是非常令人沮丧的。

为了避免这个问题,您可以在端口 :80(或 8080)上的服务器启动一个 go 例程,使用这段简单的代码将所有请求重定向到端口 443:

// redir is a net.Http handler which redirects incoming requests to the 
// proper scheme, in this case being https
func redir(w http.ResponseWriter, req *http.Request) {
hostParts := strings.Split(req.Host, ":")
http.Redirect(w, req, "https://"+hostParts[0]+req.RequestURI, http.StatusMovedPermanently)
}


func main() {

// this go subroutine creates a server on :8080 and uses the redir handler
go func() {
err := http.ListenAndServe(":8080", http.HandlerFunc(redir))
if err != nil {
panic("Error: " + err.Error())
}
}()

http.ListenAndServeTLS(":"+Config.String("port"), Config.Key("https").String("cert"), Config.Key("https").String("key"), router)
}

希望对你有帮助干杯,

关于ssl - 去 ListenAndServeTLS 握手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37878460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com