前言
从接触Go语言的那天开始,一直在写Http服务,从来没启用过Https服务。因为Https需要证书和私钥,一直不知道怎么弄。中间鼓起勇气尝试过几次,但是都以失败告终。
失败的原因是一直不知道证书、私钥是什么?Https是如何使用证书和私钥的?只要弄清楚了这些问题,开启Https服务也就是顺水推舟的事了。
关于证书和密钥相关的问题,强烈建议阅读密钥&数字签名&数字证书一文。总结如下:
- 证书可以认为就是公钥;
- 在Https通信中,需要CA认证中心的证书以及服务器的证书和私钥;
- 服务器的证书是用来发送给客户端的;
- CA认证中心的证书需要安装在客户机上,用来验证服务器证书的真实性;那么CA证书的真实性如何验证呢?不好意思,CA证书是自认证的。
现在我们可以确定开启Https服务需要三样东西:CA证书、服务器证书、服务器私钥。如何制作这三样东西并通过Golang开启Https服务就是本文的目的。
自制证书
自制证书的软件(我知道的)有两款:OpenSSL和XCA。前者是命令行界面,后者是图形界面,强烈推荐使用XCA。
关于证书制作过程,可以参考这篇文章,写的图文并茂。证书制作好以后需要导出三样东西,一是CA证书,二是服务器证书,三是服务器私钥。关于证书的导出,文中已经写的很清楚了,我说一下服务器私钥的导出。首先切换到Private Keys
选项卡,然后选中服务器私钥,最后点击Export
导出。
服务器证书和服务器私钥导出后放到一个文件夹,编程的时候会用到。CA证书需要安装到浏览器中,谷歌浏览器可以参考这里。
到这里所有的准备工作就做好了。
开启Https服务
有了前面的基础,Go语言开启Https服务就如同开启Http服务一样简单。代码如下↓
package main
import (
"net/http"
)
var certPath = "F:\\certFile\\server\\cert01.crt"
var keyPath = "F:\\certFile\\server\\cert01.pem"
func hello(w http.ResponseWriter, r *http.Request) {
fmt.Println(r.Proto) //打印http协议版本
w.Write([]byte("<h1>hello world!</h1>"))
}
func main() {
http.HandleFunc("/hello", hello)
http.ListenAndServeTLS(":8080", certPath, keyPath, nil)
}
运行上面的代码,在浏览器中输入https://localhost:8080/hello
回车就可以了,当然你的浏览器可能会告诉你这个链接不安全,继续访问就可以了。
上面的代码还会打印出Http协议的版本,这里会打印HTTP/2.0
。这说明用ListenAndServeTLS
开启Https服务时,Golang会自动使用HTTP/2.0
协议。