第一句子大全,网罗天下好句子,好文章尽在本站!

GO语言排雷4:证书有效的情况下https或tls中的报证书错误的解决

时间:2023-12-16

说实在的,golang 在跨平台这方面还是做得相当的好的,即使是在 windows 上交叉编译出的 linux 二进制文件,也是可以非常良好的运行的 这实际上

友情提示:本文共有 2734 个字,阅读大概需要 6 分钟。

今天我们要说的这个又是 go 语言中的一个巨坑:在开发环境中运行正常的程序放到生产环境中却报证书错误。说实在的,golang 在跨平台这方面还是做得相当的好的,即使是在 windows 上交叉编译出的 linux 二进制文件,也是可以非常良好的运行的 -- 这实际上也是 go 语言的一大卖点和设计目标。所以这个错误并不太可能是平台之间的差异造成的。仔细查找原因后发现是程序在使用 https/tls 时报的服务器证书不正确。但证书来自大厂的出品,绝对没得问题的,而且也用浏览器测试过了。

这种情况下显然不是服务器的证书有误,其实如果读者有 https/ssl/tls 的原理基础的话很容易就能猜到这是因为本机上没有对应认证机构的根证书。关于 https/ssl/tls 的原理知识大家可在找找看本百家号中的 openssl 相关系统文章,这里就不赘述了。

所以解决的办法也很简单,方法一是将服务器认证的机构证书在本机上装一个就好;二是忽略掉这个证书错误,继续执行,相关的代码如下:

package mainimport ("fmt""net/http""crypto/tls")func main() {tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true},}client := &http.Client{Transport: tr}_, err := client.Get("https://xxxx/")if err != nil {fmt.Println(err)}}

重点其实是 TLSClientConfig 那一行,不过这个例子不太完整,一个实际的 https 其实要考虑的内容很多,实际工作中所用的函数要复杂得多,我共享给大伙吧!这段代码随便还解决了本系列上一篇中的 http 超时的问题,相信我,在别的地方您找不到这段代码 :)

//有超时的 http 请求,单位秒func HttpGet_TimeOut(url string, second time.Duration) ([]byte) {defer PrintError("HttpGet_TimeOut"); //var r []byte = nil; var c *http.Client = &http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, //InsecureSkipVerify参数值只能在客户端上设置有效//clq add 让客户端跳过对证书的校验 Dial: func(netw, addr string) (net.Conn, error) { ////c, err := net.DialTimeout(netw, addr, time.Second*3) c, err := net.DialTimeout(netw, addr, time.Second * second); if err != nil { fmt.Println("HttpGet_TimeOut() dail timeout", err); return nil, err; } fmt.Println("HttpGet_TimeOut 连接成功 ..."); //test 仍然有卡死的情况 //clq add 似乎可以在这里设置整个通话过程中的时间,超时 SetConnectTimeOut(c, 10);//test add //c.SetDeadline( //其实这样也可以 return c, nil; }, MaxIdleConnsPerHost: 10, ////ResponseHeaderTimeout: time.Second * 2, ResponseHeaderTimeout: time.Second * second, //这个应该指的是读取头信息时的超时 //IdleConnTimeout: time.Second * second, //test 据说 可以控制连接池中一个连接可以idle多长时间 IdleConnTimeout: time.Second * 60, //test add 据说 可以控制连接池中一个连接可以idle多长时间 }, } //c.Get(url); //resp, err := http.Get(url); fmt.Println("HttpGet_TimeOut c.Get(url) ..."); //test 仍然有卡死的情况 resp, err := c.Get(url); fmt.Println("HttpGet_TimeOut c.Get(url)end ..."); //test 仍然有卡死的情况if err != nil {fmt.Println("error:", err);return nil;} defer resp.Body.Close(); //一定要有 fmt.Println("HttpGet_TimeOut ioutil.ReadAll ..."); //test 仍然有卡死的情况 //resp.Header fmt.Println(resp.Header.Get("Content-Length")); //test fmt.Println(resp.Header.Get("Date")); //test fmt.Println(resp.Header); //test fmt.Println("resp.ContentLength: ", resp.ContentLength); //test 有些 https 站点没有这个头,也许是这个原因导致后面的 ioutil.ReadAll 无效 body, err := ioutil.ReadAll(resp.Body); //就是这里卡的 fmt.Println("HttpGet_TimeOut ioutil.ReadAll end ..."); //test 仍然有卡死的情况 //fmt.Println(string(body)); if err != nil {fmt.Println("error:", err);return nil;} //return r; return body; }//

好了,这可是个超实用的函数,祝大伙周末愉快

本文如果对你有帮助,请点赞收藏《GO语言排雷4:证书有效的情况下https或tls中的报证书错误的解决》,同时在此感谢原作者。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。
显示评论内容(2)
  1. 陌_颜。2024-01-05 15:06陌_颜。[北京市网友]203.15.151.228
    @心,总是漂浮不定 继续期待GO语言排雷系列的分享,每一篇都能帮助到我们解决实际问题,非常棒!
    顶7踩0
  2. 心,总是漂浮不定2023-12-26 11:28心,总是漂浮不定[陕西省网友]222.60.42.135
    GO语言排雷系列真是太实用了,不懂的错误报证书问题终于有了解决方案,太感谢了!
    顶6踩0
相关阅读
GB/T 40861-2021 英文版 汽车信息安全通用技术要求

GB/T 40861-2021 英文版 汽车信息安全通用技术要求

本文件适用于M类、N类汽车整车及其电子电气系统和组件

2014-09-25 #经典句子

有过压分 不保护一志愿黑历史 华侨大学英语语言文学考研能报吗

有过压分 不保护一志愿黑历史 华侨大学英语语言文学考研能报吗

首先来了解一下,华侨大学英语语言文学的发展历程和专业水平

2017-07-11 #经典句子

德国留学经验 | 德国高校认证的语言考试

德国留学经验 | 德国高校认证的语言考试

尤其是在德国多数专业为德语授课的情况下,掌握了德语,才能顺利地完成学业,并且更好地适应当地的生活

2019-01-11 #经典句子

申请西班牙硕士的英语证书科普:雅思/托福/剑桥英语

申请西班牙硕士的英语证书科普:雅思/托福/剑桥英语

雅思考试的时间与地点雅思在中国的43个城市设有95个考点,每年有48个考试日期,平均一个月大概有4场考试,也就是说,每周都有考试

2019-07-11 #经典句子

英语学习进阶之路——从打招呼到全英文演讲 都经历了什么?

英语学习进阶之路——从打招呼到全英文演讲 都经历了什么?

朗思IESOL六个级别证书朗思IESOL的六个级别与CEFR完全对照,将语言能力从基础使用者A1,A2、独立使用者B1,B2到熟练运用者C1,C2分成六个级别

2023-07-10 #经典句子

高顿CMA:cma是什么考试?cma选择中文还是英文?

高顿CMA:cma是什么考试?cma选择中文还是英文?

一、cma是什么考试?cma考试时间分为中英文两种,考试时间不一样,中文一般有三个考季,分别在4月、7月和11月的某个周六;英文三个考季,每个考季两个窗口

2009-01-17 #经典句子

澳洲留学语言类专业是哪3类呢?

澳洲留学语言类专业是哪3类呢?

那么澳大利亚有哪些语言类的专业可供广大留学生们选择呢?我们一起来看看吧!一、英文语言学 英文文学类语言学,是一门较为奇妙的专业

2015-10-14 #经典句子

5分钟了解——JLPT日本语能力测试

5分钟了解——JLPT日本语能力测试

JLPT日本语能力测试 The JapaneseLanguage Proficiency TestJLPT考试概况:日本语能力测试JLPT The JapaneseLanguage Proficiency Test是对日本国

2016-04-19 #经典句子