之前我们讲的所有请求都是 HTTP 请求,在 net/http 包还提供了 ​​http.ListenAndServeTLS()​​ 方法,用于处理 HTTPS 连接请求:

func ListenAndServeTLS(addr, certFile, keyFile string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServeTLS(certFile, keyFile)
}

通过源码我们知道,调用此方法需要四个参数,除了 ​​addr​​​ 和 ​​handler​​​ 之外,还要有 ​​证书文件​​​ 和 ​​对应的私钥文件​​​ ,比如 ​​certFile​​​ 对应 SSL 证书文件存放路径, ​​keyFile​​​ 对应证书私钥文件路径。如果证书是由权威机构签发的, ​​certFile​​ 参数指定的路径必须是存放在服务器上的经由 CA 认证过的 SSL 证书。

在开发环境下,我们要自己生成证书。在 Go 中提供了生成证书的方法,打开命令行,进入项目路径,运行下面命令(命令中跟的是 Go 安装路径):

go run c:\Go\src\crypto\tls\generate_cert.go -host localhost

运行后会生成 cert.pemkey.pem 两个文件。接着编写 main.go 文件:

package main

import (
"net/http"
)

func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("HTTPS"))
})
http.ListenAndServeTLS("localhost:8080", "cert.pem", "key.pem", nil)
}

运行程序,访问 ​​http://localhost:8080/​​​ 提示无法访问,接着访问 ​​https://localhost:8080/​​ ,因为浏览器无法验证证书,会显示提示信息,我们点击继续访问就可以访问该网站了,可以看到网页显示结果如下:

Go 处理 HTTPS 请求_命令行