今天在使用golang请求微信服务时,出现错误。

x509: certificate signed by unknown authority

从日志来看go实现的Client端默认也是要对服务端传过来的数字证书进行校验的,但客户端提示:这个证书是由不知名CA签发 的!

对应这个问题,有2种不同的解决办法。

client端忽略证书的校验

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

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

func main() {
resp, err := http.Get("https://localhost:8081")
if err != nil {
fmt.Println("error:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}

此时运行客户端,会提示错误

1
error: Get https://localhost:8081: x509: certificate signed by unknown authority

可以修改代码,忽略对证书的校验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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://localhost:8081")

if err != nil {
fmt.Println("error:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}

设置tls.Config的InsecureSkipVerify为true,client将不再对服务端的证书进行校验

添加CA证书

可以添加ca-certificates证书

可以将CA证书打包到docker镜像

1
2
RUN apk --no-cache add ca-certificates \
&& update-ca-certificates

使用apk命令安装我们需要的包ca-certificates(以便使用TLS的页面)

参考文章

Alpine Linux添加Let’s Encrypt CA证书或者自签CA证书

golang GET 出现 x509: certificate signed by unknown authority