本文来源:腾讯优图实验室
笔者来自腾讯优图实验室,优图实验室专注于图像处理、模式识别、深度学习,在人脸识别、图像识别、医疗AI、交通、OCR 等领域积累了领先的技术水平和完整的解决方案。近年来,优图在计算机视觉领域的研究和应用积累了深厚的底蕴和丰富的行业落地经验。笔者所在的团队主要负责视觉AI能力赋能边缘计算设备的研发工作。一直以来,在实验室甚至整个公司特别强调“安全和隐私”,近半年,笔者在用 GoLang 开发智能边缘计算设备的网络通信项目时,常被要求务必重视“通信的安全和隐私”。期间,对接了多个合作方,有的要求“公网下要防止域名劫持”,有的要求“客户端上报要带‘证书’啊,更安全”,还有要求除了要用 HTTPS,还要在业务逻辑上再进行二次哈希、摘要、加密等等。由于笔者对 HTTPS 的认知也仅停留在 “HTTPS 比 HTTP 更安全”的层面上,在项目开发中遇到很多通信相关的问题经常束手无策,因此沉下心来,认认真真学习了 HTTPS 并记录成此文。
I. HTTPS 之灵魂三问
要说 HTTPS,搞 IT 的甚至是不搞 IT 的,都知道:“HTTPS 比 HTTP 安全”。因此但凡要开发涉及网络传输的项目时,得到的需求一定有:“要用 HTTPS”。
1.1 HTTPS 是什么?
维基百科对 HTTPS 的解释是:
超文本传输安全协议(英语:HyperText Transfer Protocol Secure,缩写:HTTPS;常称为 HTTP over TLS、HTTP over SSL 或 HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在 1994 年首次提出,随后扩展到互联网上。
抓重点:HTTPS=HTTP over SSL/TLS,也就是说,HTTPS 在传输层 TCP 和应用层 HTTP 之间,多走了一层 SSL/TLS。
由此可见,TLS/SSL 是 HTTPS 的核心! 那么,这个TLS/SSL又是何方神圣呢?文章How to use SSL/TLS to Secure Your Communications: The Basics指出:
The SSL/TLS protocol functions between two layers of the OSI Presentation layer.The handshake and record layers operate over TCP/IP to encrypt data received directly from the Application layer.
SSL/TLS 协议作用在传输层和应用层之间,对应用层数据进行加密传输。
借用文中的图,可以直观感受到:SSL和TLS都是加密协议。SSL,全称 Secure Socket Layer,在 1994 年由网景公司(Netscape)最早提出 1.0 版本;TLS,全称 Transport Layer Security,则是 1999 年基于 SSL3.0 版本上改进而来的。官方建议弃用 SSL 而保留和采用 TLS,但是由于历史原因,SSL 仍然存在,而且很多人已经习惯 SSL 这个名词,因此现在索性就叫成 SSL/TLS。
SSL/TLS 的发展史,可以阅读文章《SSL/TLS 发展历史和 SSLv3.0 协议详解》;关于两者的异同,推荐阅读文章《SSL vs. TLS - What’s the Difference?》。
1.2 HTTPS 为什么?
肯定有不少同学不假思索:“当然是 HTTP 不安全,HTTPS 安全,所以选择 HTTPS 呗!”那么,HTTPS 比 HTTP“好”在哪里?
维基百科上对 HTTP 的解释如下:
设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。
HTTP 的发展是由蒂姆·伯纳斯-李于 1989 年在欧洲核子研究组织(CERN)所发起。HTTP 的标准制定由万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering Task Force,IETF)进行协调,最终发布了一系列的 RFC,其中最著名的是 1999 年 6 月公布的 RFC 2616,定义了 HTTP 协议中现今广泛使用的一个版本——HTTP 1.1。
HTTP 协议是为了传输网页超文本(文本、图像、多媒体资源),以及规范客户端和服务器端之间互相请求资源的方法的应用层协议。在 1989 年最早推出了 HTTP 0.9 版本,而 1999 年公布的 HTTP 1.1 是到目前(2020 年)仍旧广泛使用的版本(引自《HTTP 协议几个版本的比较》)。
但是这个 HTTP 1.1 版本存在一个很大的问题-明文传输(Plaintext/Clear Text),这个问题在互联网时代的今天是致命的,一旦数据在公共网络中被第三方截获,其通信内容轻而易举地就被窃取了。
因此,HTTPS 应运而生,它被公认的三大优势有:
数据加密,防窃听
身份验证,防冒充
完整性校验,防篡改
啰嗦说一句:第 1 点确实是解决了 HTTP 明文传输;至于第 2 和第 3 点,其他一些应用层协议也会遇到(服务端被冒充、数据被篡改是网络传输中“较常见”的问题)。
再插一句题外话:2015 年推出的 HTTP 2 在 HTTP 1.1 的基础上有很大改进,其中一点就是 HTTPS。对 HTTP 2 有兴趣的同学推荐阅读《HTTP/2 中的常见问题》、《OPINION HTTP versus HTTPS versus HTTP/2》。
1.3 HTTPS 怎么做?
本文接下来将从 HTTPS 的 3 个优势展开说明,即:
数据加密,即 HTTPS 是怎么进行数据加密的。本章介绍 HTTPS 中的对称加密和非对称加密
身份验证,即 HTTPS 是怎么让客户端相信“发给我数据的服务端是我想要的服务器”。本章介绍 HTTPS 的 CA 和证书
完整性校验,即 HTTPS 是怎么做数据完整性校验以防止被篡改。本章介绍 HTTPS 的哈希
最后,为了整篇文章的完整性,还会增加以下几个内容:
HTTPS 流程,即客户端和服务器端 HTTPS 通信全过程
实际问题,记录了笔者在实战中遇到 HTTPS 相关问题
II. 数据加密:HTTPS 的对称加密和非对称加密
相信不少同学会说