golang https server
发布时间:2020-12-16 18:08:42 所属栏目:大数据 来源:网络整理
导读:最简单的https server 制作证书 openssl genrsa -out server . key 2048 openssl req -new -x509 -key server . key -out server . crt -days 365 编写程序 package main import ( "fmt" "net/http" ) func handler (w http. ResponseWriter ,r *http. Reque
最简单的https server制作证书 openssl genrsa -out server.key 2048
openssl req -new -x509 -key server.key -out server.crt -days 365
编写程序 package main
import ( "fmt" "net/http" ) func handler(w http.ResponseWriter,r *http.Request) { fmt.Fprintf(w,"Hi,This is an example of https service in golang!") } func main() { http.HandleFunc("/",handler) http.ListenAndServeTLS(":9090","server.crt","server.key",nil) }
启动服务 go run https.go
演示效果 curl -k https://127.0.0.1:9090
Hi,This is an example of https service in golang!
其中的-k就是忽略证书的意思,不验证服务端 package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
resp,err := http.Get("https://tim:9090")
if err != nil {
fmt.Println("error:",err)
return
}
defer resp.Body.Close()
body,err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
此时会报错 package main
import (
"crypto/tls"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},}
client := &http.Client{Transport: tr}
resp,err := client.Get("https://tim:9090")
if err != nil {
fmt.Println("error:",err)
return
}
defer resp.Body.Close()
body,err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
上面的tim需要注意,如果设置验证证书的话(TLSClientConfig: &tls.Config{InsecureSkipVerify: false}), x509: cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs
另一个是证书是否是权威的签发了,否则就是上面的unknown authority了 校验服务端的客户端如果你是需要安全的监测服务端,当然也是可以的,那么下面演示如何安全建立连接 openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=tim" -days 5000 -out ca.crt
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=tim" -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000
服务端不需要任何变化,但客户端需要ca证书, package main
import (
"crypto/tls"
"crypto/x509"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
pool := x509.NewCertPool()
caCertPath := "/mnt/go/src/test/clinet/ca.crt"
caCrt,err := ioutil.ReadFile(caCertPath)
if err != nil {
fmt.Println("ReadFile err:",err)
return
}
pool.AppendCertsFromPEM(caCrt)
tr := &http.Transport{
TLSClientConfig: &tls.Config{RootCAs: pool},err := client.Get("https://tim:9090")
if err != nil {
fmt.Println("Get error:",err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
运行一下 go run clinet.go
Hi,This is an example of https service in golang!
这样客户端的验证服务端的单向验证就是ok了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |