https 实践篇

基于https原理篇,这篇文章将会用openssl 工具以及golang程序来演示下https加解密过程。 依据前文已经知道 声明一个https服务需要为其颁发证书已经它的私钥。

生成服务器私钥
openssl genrsa -out server.key 2048
生成x509证书
openssl req -new -x509  -key server.key -out server.crt -days 3650

server.crt 就是我们的自签名证书了,然后启动go https服务

启动go https服务
package main

import (
	"log"
	// "fmt"
	// "io"
	"net/http"
)

func HelloServer(w http.ResponseWriter, req *http.Request) {
	w.Header().Set("Content-Type", "text/plain")
	w.Write([]byte("This is an example server.\n"))
	// fmt.Fprintf(w, "This is an example server.\n")
	// io.WriteString(w, "This is an example server.\n")
}

func main() {
	http.HandleFunc("/hello", HelloServer)
	err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

先测试下访问
(base) ➜  ~ curl https://proxy.example.com:443/hello
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl 提示是自签名证书,因为我们使用的openssl 按x509标准生成的证书,不是ca颁发的,所以curl有这个错误。

让系统信任该证书

不同操作系统添加信任的方式不同,我使用的是mac os,在钥匙串应用里将证书添加进来并设置为信任。 image.png 注意这里我设置了证书的域名是proxy.example.com ,所以我还需要设置下这个域名对应的ip

设置域名
vim /etc/hosts

255.255.255.255 broadcasthost
127.0.0.1       localhost
::1             localhost

## 添加上这行
127.0.0.1 proxy.example.com
再次访问
(base) ➜  ~ curl https://proxy.example.com:443/hello
This is an example server.

完美收工。。。