Go中TLS源码学习(1)之Https服务端框架详解

  • Post author:
  • Post category:其他


请添加图片描述



💖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服务相关的逻辑

请添加图片描述



版权声明:本文为s2603898260原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。