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)
    

    以添加多个证书

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值