概述
????SSL/TLS专栏目录导航????
专栏包括的内容: |
---|
????1. SSL/TLS原理知识 |
????2. Go源码中TLS实现 |
????3. openssl中TLS实现 |
????4. SSL卸载 |
????5. SSL代理 |
????6. SSL V.P.N |
????7. SSL 与 IPSec |
????8. 其他 |
SSL/TLS协议从诞生到现在已经近30年了,除了早期网景公司的程序员实现的SSL上存在部分技术问题外,SSL3.0到TLS1.3的实现还是很成熟、稳定的。现阶段,TLS的实现比较经典的有openssl, 这个简直是安全领域的圣经呀,采用C代码构建的庞大的体系,openssl及其衍生项目应该称得上是当下网络安全的基石。
当然除了openssl外,还有一个比较经典的https包实现,这就是go源码中的net/http包。加之现在正在使用Go语言做项目,为了更加快速学习go语言及其编码规范,因此准备学习下go源码中的tls实现。
本文计划将Go源码、openssl中的TLS实现做一个简要的学习并记录之。涉及的语言主要是:Go语言,C语言。
通过这个TLS实现章节(注:此文只是节选的一部分, 最初是一个介绍TLS实现的大章节,既包括go实现,也包括c实现;因此这里章节序号不再调整,方便以后直接更新修改完善),希望能够达到的目标如下:
- 逐步深入了解TLS握手协议
- 了解TLS握手协议中各关键字段的使用方式、作用
- 能够分析TLS为何这样设计
- 针对某种场景,根据TLS协议特点分析是否能够满足要求
5.1 Go源码TLS实现
先易后难吧,go的实现应该比较人性化一点。不能上来就啃硬骨头,容易失去信心。
5.1.1 https服务端实例
在Go中创建https服务比较容易。下面给一个示例:
在浏览器中输入对应的URL便可以访问go创建的https服务器:
上面演示了如何使用Go搭建一个Https服务器。下面便是通过刚才的程序,一步步来学习经典的net/http中HTTPS的实现框架,并重点学习其中的TLS的实现逻辑。
5.1.2 https实现框架
学习一门语言,网上的大佬们都是推荐阅读源码,通过那些顶级开发者的代码形成良好的编码风格和习惯。这也是我比较推崇的学习方式,在工作中也偶尔去阅读一些经典的源码实现;学习Go语言自然不能放过net/http包的实现。Why? 因为Go的net/http包在业界中相当的出名,非常优秀,因此一直做网络开发并在学习Go的我应该学习下。
最初的一段时间,直接在go源码中寻找tls的实现。感觉找到了,因为到处都是TLS相关的代码,但是又没完全找到,只是因为我不知道从哪里开始阅读,谁最初调用的协商接口,最后报文又发向何方,等等诸多问题 。困难比较大,于是乎,颓废了一段时间。后来我开始循序渐进的学习,先学习基本的http服务的逻辑,然后是gin实现的web框架,最后才到了tls实现。现在再回首,这个路线还是很有效果,后来阅读TLS代码容易了很多。
Go中https服务端框架整理如下:
无论go原生的web框架,还是Gin框架等等,都是采用上述架构。它也是非常常见的服务器模型:
❤️ 一个协程(线程)专门用于监控端口,创建连接;
❤️ 每一个连接创建一个协程(线程),专门处理该连接上的业务逻辑
不同的是,其他语言(如C)都是采用线程来处理,而Go采用更加轻量级的gorouting来处理,因此性能更佳,能处理更多的并发请求。
上图中还重点强调了“Web框架”。目前go存在很多的web框架,原因在于Go源码中的默认web框架实现非常的简单(ServeHTTP实现的比较简单),无法满足比较复杂的业务逻辑。如果想实现更复杂的web框架,可以自定义实现满足需求的web框架(无论如何实现,但必须实现ServeHTTP接口)。Go原生的ServeHTTP(默认:DefaultServeMux)实现中,路由采用的是map的方式,而Gin框架中采用的是前缀树的方式;前缀树的方式是目前比较通用的路由匹配算法。
上图中的框架比较简洁,也是比较通用的服务器架构。下面是我整理了很久的HTTPS的框架实现。将关键核心代码放到了图片中,可以通过一张图来了解go中Https服务实现的基本框架。下图的左半侧是TLS相关的逻辑;右半侧是原生Http服务相关的逻辑。
最后
以上就是安详小猫咪为你收集整理的Go中TLS源码学习(1)之Https服务端框架详解????SSL/TLS专栏目录导航????的全部内容,希望文章能够帮你解决Go中TLS源码学习(1)之Https服务端框架详解????SSL/TLS专栏目录导航????所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复