安装go
巧妇难为无米之炊,第一步当然是先在服务器安装go喽,
先下载压缩包 wget [https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz](https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz) 再解压 tar -zxvf go1.8.linux-amd64.tar.gz -C /usr/local然后配置环境 sudo vim /etc/profile 环境里面加入路径export GOROOT=/usr/local/go //这里是你安装go的路径哦export GOPATH=/home/ubuntu/webgoexport PATH=$GOROOT/bin:$PATH试一试安装成功没 go version
试试http请求
我使用FileZilla将本地的一个main.go文件拖到服务器。
package mainimport ( "net/http" "fmt")func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "hello, http") }func main() { http.HandleFunc("/",handler) http.ListenAndServe("0.0.0.0:80",nil) }
hello, http-p 80:8080
https部署
先在腾讯云SSL证书管理,有1年的免费使用。腾讯有详细的每步教程,这边就不说了,文档写的确实不错(有大厂风范啊~)。
申请完毕后如下:
image.png
下载后如下:我们使用的是Nginx下的2个文件,一个是密钥,一个是数字证书。简单介绍一下吧,里面的知识点太多,网上也很多。
image.png
HTTPS的数据传输是加密的。实际使用中,HTTPS利用的是对称与非对称加密算法结合的方式。
对称加密,就是通信双方使用一个密钥,该密钥既用于数据加密(发送方),也用于数据解密(接收方)。
非对称加密,使用两个密钥。发送方使用公钥(公开密钥)对数据进行加密,数据接收方使用私钥对数据进行解密。
实际操作中,单纯使用对称加密或单纯使用非对称加密都会存在一些问题,比如对称加密的密钥管理复杂;非对称加密的处理性能低、资源占用高等,因 此HTTPS结合了这两种方式。
HTTPS服务端在连接建立过程(ssl shaking握手协议)中,会将自身的公钥发送给客户端。客户端拿到公钥后,与服务端协商数据传输通道的对称加密密钥-对话密钥,随后的这个协商过程则 是基于非对称加密的(因为这时客户端已经拿到了公钥,而服务端有私钥)。一旦双方协商出对话密钥,则后续的数据通讯就会一直使用基于该对话密 钥的对称加密算法了。
上述过程有一个问题,那就是双方握手过程中,如何保障HTTPS服务端发送给客户端的公钥信息没有被篡改呢?实际应用中,HTTPS并非直接传输公钥信息,而是使用携带公钥信息的数字证书来保证公钥的安全性和完整性。
数字证书,又称互联网上的"身份证",用于唯一标识一个组织或一个服务器的,这就好比我们日常生活中使用的"居民身份证",用于唯一标识一个 人。服务端将数字证书传输给客户端,客户端如何校验这个证书的真伪呢?网站的证书也是同样的道理。一般来说数字证书从受信的权威证书授权机构 (Certification Authority,证书授权机构)买来的(免费的很少)。一般浏览器在出厂时就内置了诸多知名CA(如Verisign、GoDaddy、美国国防部、 CNNIC等)的数字证书校验方法,只要是这些CA机构颁发的证书,浏览器都能校验。对于CA未知的证书,浏览器则会报错。主流浏览器都有证书管理功能,但鉴于这些功能比较高级,一般用户是不用去关心的。
好了,接下来将2个文件拷贝很main.go拷贝在一起
image.png
修改main.go
package mainimport ( "net/http" "fmt" "crypto/tls")func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "hello, https") }func main() { server := http.NewServeMux() server.HandleFunc("/",handler) cfg := &tls.Config{ MinVersion: tls.VersionTLS12, CurvePreferences: []tls.CurveID{tls.CurveP521, tls.CurveP384, tls.CurveP256}, PreferServerCipherSuites:true, CipherSuites: []uint16{ tls.TLS_RSA_WITH_AES_256_CBC_SHA, tls.TLS_RSA_WITH_AES_256_GCM_SHA384, tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, }, } srv := &http.Server{ Addr: "0.0.0.0:443", Handler: server, TLSConfig:cfg, TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler), 0), } srv.ListenAndServeTLS("1_www.ljbniubi.top_bundle.crt", "2_www.ljbniubi.top.key") }
其实上面一大堆config不写也可以的,直接:
package mainimport ( "net/http" "fmt")func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "hello, https") }func main() { http.HandleFunc("/",handler) http.ListenAndServeTLS(":443","1_www.ljbniubi.top_bundle.crt","2_www.ljbniubi.top.key", nil) }
hello, https
后台保持运行
由于go run main.go 关闭端口的时候就会取消。所以使用
go build ./main.go 会生成一个main的运行文件 nohup ./main & 后台运行main文件 killall -9 main 你可能还要关闭main
总结
好像没什么好总结的~
参考资料:
ubuntu 16.04 安装go 1.8 步骤
http、https 等 常用默认端口号
Go和HTTPS