Golang ListenAndServeTLS在浏览器中不使用https时返回数据

时间:2014-05-06 11:56:49

标签: http ssl https go

以下是我的后端:

package main

import (
    "fmt"
    "net/http"
)

const (
    PORT       = ":8443"
    PRIV_KEY   = "./private_key"
    PUBLIC_KEY = "./public_key"
)

func rootHander(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Nobody should read this.")
}

func main() {
    http.HandleFunc("/", rootHander)
    err := http.ListenAndServeTLS(PORT, PUBLIC_KEY, PRIV_KEY, nil)
    if err != nil {
        fmt.Printf("main(): %s\n", err)
    }
}

使用以下两行生成密钥:

openssl genrsa -out private_key 2048
openssl req -new -x509 -key private_key -out public_key -days 365

当我启动tls服务器并使用浏览器(https://example.com:8443)访问该网站时,我得到了预期的结果,忽略浏览器警告之后:

Nobody should read this.

到目前为止一切都很酷。

现在,当我将浏览器指向http://example.com:8443时(注意使用了http,不是 https),我得到了Firfox的以下结果(Chrome也是如此,但是下载了网站):

using http

问题:为什么会出现问号?

3 个答案:

答案 0 :(得分:9)

如果将输出传递给od curl -k -3 http://localhost:8443 | od -A n -t x1,则会获得由浏览器呈现/处理的以下字节序列15 03 01 00 02 02 0a

根据https://code.google.com/p/go/issues/detail?id=2253,对于&#34来说是TLS;我不明白你说的是什么。"

答案 1 :(得分:4)

如果仍然相关:

http.ListenAndServeTLS(...)需要证书私钥而非公开和; 私钥

答案 2 :(得分:1)

以下是一些代码,用于将端口80上的请求重定向到443,并使用类似于加密的CA来提供tls证书。我知道使用let encrypt(letsencrypt.org)你想引用生成的fullchain.pem文件以及privkey.pem。

自签名的最大问题是它在生产中不太可行。使用golang,我们确实非常具体地配置了我们的应用程序,所以在我们准备好启动时,正确附加tls证书这一点非常重要。

这里有一些我用来启动静态站点的简单代码:

package main
import (
"net/http"
"log"
)
func redirect(w http.ResponseWriter, req *http.Request) {
 // remove/add not default ports from req.Host
 target := "https://" + req.Host + req.URL.Path
 if len(req.URL.RawQuery) > 0 {
     target += "?" + req.URL.RawQuery
 }
 log.Printf("redirect to: %s", target)
 http.Redirect(w, req, target,
         http.StatusTemporaryRedirect)
 }


func main() {
 //define a variable for the FileServer directory in this case ./static/
 var fs = http.FileServer(http.Dir("static"))
 //express the handler function
 http.Handle("/", fs)
 //We should redirect requests on port 80
 go http.ListenAndServe(":80", http.HandlerFunc(redirect))
 //finally we Listen for requests and serve them up on a specific port
 http.ListenAndServeTLS(":443", "fullchain.pem", "privkey.pem", nil)

 }