golang 部署在服务器,并且安装SSL证书,Https请求
安装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/webgo
export PATH=$GOROOT/bin:$PATH
试一试安装成功没
go version
试试http请求
我使用FileZilla将本地的一个main.go文件拖到服务器。
package main
import (
"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)
}
然后输入自己的域名http://www.ljbniubi.top,就可以看到hello, http
这里有一个坑,就是平时我们监听的端口都是8080,但现在不一样了,是通过服务器访问。我记得我以前docker部署的时候是-p 80:8080
标志打开HTTP端口80并将其映射至前面通过EXPOSE命令暴露的8080端口。
HTTP服务器,默认的端口号为80/tcp);
HTTPS(securely transferring web pages)服务器,默认的端口号为443/tcp 443/udp;----所以下面要监听https的话要443端口哦
https部署
先在腾讯云SSL证书管理,有1年的免费使用。腾讯有详细的每步教程,这边就不说了,文档写的确实不错(有大厂风范啊~)。
申请完毕后如下:
![](https://img.haomeiwen.com/i2868618/60d8c9306e23f4bb.png)
下载后如下:我们使用的是Nginx下的2个文件,一个是密钥,一个是数字证书。简单介绍一下吧,里面的知识点太多,网上也很多。
![](https://img.haomeiwen.com/i2868618/081f4f38de0ecb7f.png)
HTTPS的数据传输是加密的。实际使用中,HTTPS利用的是对称与非对称加密算法结合的方式。
对称加密,就是通信双方使用一个密钥,该密钥既用于数据加密(发送方),也用于数据解密(接收方)。
非对称加密,使用两个密钥。发送方使用公钥(公开密钥)对数据进行加密,数据接收方使用私钥对数据进行解密。
实际操作中,单纯使用对称加密或单纯使用非对称加密都会存在一些问题,比如对称加密的密钥管理复杂;非对称加密的处理性能低、资源占用高等,因 此HTTPS结合了这两种方式。
HTTPS服务端在连接建立过程(ssl shaking握手协议)中,会将自身的公钥发送给客户端。客户端拿到公钥后,与服务端协商数据传输通道的对称加密密钥-对话密钥,随后的这个协商过程则 是基于非对称加密的(因为这时客户端已经拿到了公钥,而服务端有私钥)。一旦双方协商出对话密钥,则后续的数据通讯就会一直使用基于该对话密 钥的对称加密算法了。
上述过程有一个问题,那就是双方握手过程中,如何保障HTTPS服务端发送给客户端的公钥信息没有被篡改呢?实际应用中,HTTPS并非直接传输公钥信息,而是使用携带公钥信息的数字证书来保证公钥的安全性和完整性。
数字证书,又称互联网上的"身份证",用于唯一标识一个组织或一个服务器的,这就好比我们日常生活中使用的"居民身份证",用于唯一标识一个 人。服务端将数字证书传输给客户端,客户端如何校验这个证书的真伪呢?网站的证书也是同样的道理。一般来说数字证书从受信的权威证书授权机构 (Certification Authority,证书授权机构)买来的(免费的很少)。一般浏览器在出厂时就内置了诸多知名CA(如Verisign、GoDaddy、美国国防部、 CNNIC等)的数字证书校验方法,只要是这些CA机构颁发的证书,浏览器都能校验。对于CA未知的证书,浏览器则会报错。主流浏览器都有证书管理功能,但鉴于这些功能比较高级,一般用户是不用去关心的。
好了,接下来将2个文件拷贝很main.go拷贝在一起
![](https://img.haomeiwen.com/i2868618/642dd22cbb943017.png)
修改main.go
package main
import (
"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 main
import (
"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)
}
这个时候访问https://www.ljbniubi.top 就会出现hello, https
后台保持运行
由于go run main.go 关闭端口的时候就会取消。所以使用
go build ./main.go
会生成一个main的运行文件
nohup ./main &
后台运行main文件
killall ./main
你可能还要关闭main
总结
好像没什么好总结的~
参考资料:
ubuntu 16.04 安装go 1.8 步骤
http、https 等 常用默认端口号
Go和HTTPS