1. 前言
- 创建自建证书
私钥生成:
openssl genrsa -des3 -out server.key 2048
openssl rsa -in server.key -out server.key
CA生成:
openssl req -new -x509 -key server.key -out ca.crt -days 3650
csr生成:
openssl req -new -key server.key -out server.csr
证书生成:
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt -days 3650
2. httplib包调用
- 调用ge方法
downloadUrl := "https://172.3.3.3:8888?fileid=123156478946"
req := httplib.Get(downloadUrl)
req.SetTimeout(time.Second*30, time.Second*time.Duration(timeout))
req.String()
- 调用post方法
postURL := "https://172.3.3.3:8888?fileid=123156478946"
req := httplib.Post(postURL)
req.SetTimeout(time.Second*30, time.Second*time.Duration(timeout))
req.Param("fileInfo", string(data))
req.String()
3. 遇到的问题
-
x509: cannot validate certificate for xxx because it doesn’t contain any IP SANs
原因:通过IP访问服务器,会检查证书的SAN,SAN不通过导致的问题(我的理解是如果通过域名访问就不会有这个问题的)
解决方案:1. 修改本地Host文件,将IP地址映射为某一域名,通过域名访问 2. 取消证书验证 // 设置禁用证书验证 req.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true}) 3. 生成证书的时候添加SAN echo subjectAltName = IP:10.30.0.163 > extfile.cnf openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -extfile extfile.cnf -out server.crt -days 3650
-
x509: certificate signed by unknown authority
原因:你的客户端无法验证服务器证书的签发机构。这通常是因为服务器的证书不是由客户端信任的证书颁发机构(CA)签发的,或者客户端缺少了必要的根证书。
解决方案:1. 取消证书认证 // 设置禁用证书验证 req.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true}) 2. 添加根证书、验证证书链 // 读取根证书文件 caCert, err := ioutil.ReadFile("server.crt") if err != nil { fmt.Println("Failed to read root CA file:", err) return } // 创建 CertPool 并添加根证书 caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) // 创建 httplib 请求对象 req := httplib.Post("https://example.com/api") // 设置 TLS 配置 req.SetTLSClientConfig(&tls.Config{ RootCAs: caCertPool, }) // 设置超时时间 req.SetTimeout(time.Second*30, time.Second*time.Duration(timeout)) // 设置参数 req.Param("fileInfo", string(data)) // 发送请求 req.String()
如果你有多个根证书,可以多次调用
caCert, err := ioutil.ReadFile("server.crt") caCertPool.AppendCertsFromPEM(caCert)
以添加多个证书