golang 部署在服务器,并且安装SSL证书,Https请求

发布于 2018-04-23 作者 超级苦工 192次 浏览 版块 分享

安装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年的免费使用。腾讯有详细的每步教程,这边就不说了,文档写的确实不错(有大厂风范啊~)。
申请完毕后如下:


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 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

收藏
分享
暂无回复