golang语言在使用httplib包中遇到的关于自建证书的问题及解决方案

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)
    

    以添加多个证书

你可能感兴趣的:(golang,服务器)