前言
本文主要聊聊啥是 OpenSSL
目标是看完之后可以用自己的语言去介绍它
正文
一、初印象
Node.js 官方文档的 crypto 模块处有提到它,内容是:
The node:crypto module provides cryptographic functionality that includes a set of wrappers for OpenSSL's hash, HMAC, cipher, decipher, sign, and verify functions.
翻译成中文就是:
node:crypto 模块提供了加密功能,其中包含对 OpenSSL 的哈希(hash)、HMAC、加密(cipher)、解密(decipher)、签名(sign)和验证(verify)函数的一系列封装。
那么啥是 【OpenSSL】?
OpenSSL 是一个开源的、用 C 语言编写的软件库集合 和命令行工具 ,它实现了通用的密码学功能 和安全通信协议。
听了跟没听一样是正常的,可以继续看下去
其核心组成部分直接对应其名称:
- Open: 指其开源特性。
- SSL : 指其最初的核心------对 SSL(Secure Sockets Layer) 和其后继者 TLS(Transport Layer Security) 协议的实现。这是保障互联网 HTTPS 连接安全的基础。
- 工具库 : 它提供了丰富的密码学原语【原语它的英文是 Primitive,更准确的翻译是"基本构建模块"或"基础组件"。】和函数,包括:
- 对称加密(如 AES,用于加密/解密数据)
- 非对称加密(如 RSA,用于密钥交换和数字签名)
- 密码散列函数【其实就是哈希、或者叫哈希函数】(如 SHA-256,用于生成数据指纹)
- 数字证书(X.509 证书的处理)
- 随机数生成
补充:"提供密码学原语" 这句话的通俗意思就是:它提供了实现加密、解密、签名等这些基础功能所需要的"工具"或"零件"。
总结来说,OpenSSL 是互联网的安全基石软件,为大量应用程序(包括 Node.js、Web 服务器、操作系统等)提供底层的加密和安全传输能力。
二、OpenSSL 在当今世界的作用与地位
平时上网、刷手机时,所有带小锁标志的网站(比如网上银行、登录微信、收发邮件),背后基本都是它在干活。
它主要干的活主要是下面两件事:
-
发"锁"和"钥匙":帮【你】和【网站】建立一个加密的私人通道。这样你输入的密码、聊天记录、银行卡号在传输过程中就被加了密,就算被黑客截获,也只是一堆乱码。
-
验"身份证":检查你访问的网站是不是"正经网站",而不是黑客伪造的钓鱼网站。它负责核对网站的数字证书(就像网站的身份证),确认身份无误后才建立连接。
它的地位呢?可以说是拉满了 ------ 说他是互联网基石都不为过。绝大多数软件和系统(比如苹果、安卓、Windows、各种服务器)都在用它。
不妨想想,如果 OpenSSL 出了个 BUG 会怎么样?
历史上最著名的例子就是 2014 年的"心脏出血"(Heartbleed)漏洞,感兴趣的可以去康康!
三、OpenSSL 和 HTTPS 的关系是什么?
【OpenSSL】 提供了实现 【HTTPS】 所必需的核心功能库,具体包括 TLS/SSL 协议实现、对称加密(如 AES)、非对称加密(如 RSA/ECC)、证书解析(X.509)及散列算法(如 SHA)。
Web 服务器(如 Nginx、Apache)通过调用 OpenSSL 库来建立加密链路、协商会话密钥并验证服务器证书,从而为客户端的 HTTPS 请求提供端到端的加密通信和安全认证服务。
✨ 小贴士:
看到这你可能有点懵,心想:给我干哪里来了,怎么越看越头晕呢
没事,头晕是正常的,继续看下去即可,后面会有总结
四、什么是 TLS/SSL?
TLS(Transport Layer Security)及其前身 SSL(Secure Sockets Layer)是加密协议,用于在计算机网络中通过加密、身份验证和完整性保护为通信提供安全保障。
其核心功能包括协商加密算法、交换会话密钥、验证对方身份(通常通过 X.509 证书)以及对传输数据进行加密和防篡改保护,是 HTTPS、FTPS 等安全应用层协议的基础。
上面听不懂,没关系,下面举个例子:
TLS/SSL 是一个安全协议,它的作用就像一套严格的操作手册,规定了两个关键步骤,确保数据在网络上传输时的安全:
第一步:握手(Handshake)
- 身份认证 :你的浏览器(客户端)会向网站服务器请求其数字证书。浏览器会验证这张证书是否由可信的机构颁发,且是否属于你正在访问的网站。这一步确认了"你不是在和一个假网站通信"。
- 协商密钥 :验证通过后,双方会通过数学算法协商生成一个只有他俩知道的会话密钥。这个密钥用于后续通信的加密和解密。【注意:这个会话密钥是用于对称加密的,而不是非对称加密】
第二步:通信(Communication)
- 加密传输 :此后,所有在浏览器和服务器之间往返的数据,都会使用刚才生成的会话密钥进行加密和解密。任何第三方即使截获了这些数据,也无法破解其内容。
- 防篡改 :同时,协议还会对传输的数据生成一个消息验证码(MAC),就像给数据包贴上了一个防伪 seal【中文是:密封、封条】。如果数据在传输中被修改,这个 seal 就会失效,接收方会立即丢弃损坏的数据包。
总结,TLS/SSL 直接提供了三个核心保障:
- 保密性:数据被加密,窃听者看到的是乱码。
- 完整性:数据无法被篡改,篡改必被发现。
- 认证性:你通信的对象就是它声称的那个真实服务器。
你访问的任何以 https://
开头的网站,其安全基础都是这个协议。
五、【总结!!】Node.js 的 crypto 模块、OpenSSL、HTTPS、TLS/SSL 协议他们之间的关系是什么?
-
TLS/SSL 是协议: 它是一套规则,定义了如何建立安全的网络连接(包括加密、身份验证等)。HTTPS 的本质就是 HTTP over TLS/SSL。啥意思呢?其实 HTTPS 就是在普通的 HTTP 通信外面套上了一层 TLS/SSL 加密保护壳,这样理解就 ok 了。
-
OpenSSL 是实现 : 它是一个用 C 语言编写的、遵循上述协议规则的软件库和工具集。它提供了协议要求的所有密码学功能(如加密、解密、证书处理等)的具体代码实现。总的来说,OpenSSL 就是将复杂的密码学数学公式和协议规则,用 C 代码写成可以直接调用的函数。
-
Node.js crypto 模块是包装器 : Node.js 为了让开发者能方便地使用加密功能,其
crypto
模块封装(包装)了 OpenSSL 库的一部分功能,让你可以用 JavaScript 来调用这些底层能力,而无需直接写 C 代码。这里简单举一个 🌰:Node.js 的 crypto.createHash('sha256') 函数底层直接调用了 OpenSSL 的 SHA-256 算法实现。 -
HTTPS 是应用 : HTTPS 是构建在 TLS/SSL 协议之上的具体应用。一个 Web 服务器(如 Nginx)使用 OpenSSL 这个库 来实现 TLS/SSL 这个协议 ,从而提供了 HTTPS 这种安全服务。比如 Nginx 借助 OpenSSL 库的能力,来完成 TLS 握手和加密通信,从而让普通的 HTTP 服务变成了 HTTPS 服务。
关系链: OpenSSL(实现) → 提供了实现 TLS/SSL 协议 所需的功能 → 从而使得 HTTPS 得以成立 → Node.js 通过 crypto 模块 让你能访问 OpenSSL 的部分功能。
下面用图来作为结尾的总结吧,更直观一些:
text
+------------------+ "基于" +------------------+
| TLS/SSL Protocol| <-----------| HTTPS |
| (规则与标准) | | (HTTP over TLS) |
+------------------+ +------------------+
^ ^
| "实现" | "依赖"
| |
+-------------+ "被封装" +-------------+
| OpenSSL | ------------> | Node.js |
| (密码学库实现)| | crypto 模块 |
+-------------+ +-------------+
时间线
- SSL (Secure Sockets Layer) - 由 Netscape 公司开发
SSL 1.0: (未发布) 由于存在严重安全漏洞,从未正式公开过。
SSL 2.0: 1995 年 - 第一个公开发布的版本。但设计缺陷很多,很快就被证明不安全。
SSL 3.0: 1996 年 - 对 SSL 2.0 的彻底重新设计,变得非常成功和流行。为未来的 HTTPS 奠定了基础。(已于 2015 年被正式废弃,被认为不安全)
- OpenSSL - 基于 SSL 协议诞生
1998 年 - 就在 SSL 3.0 发布后不久,OpenSSL 项目正式启动。其最初的目标就是为开源社区提供一个免费的、强大的 SSL 协议实现工具库。它的名字也直接来源于此。
- TLS (Transport Layer Security) - SSL 的标准化继承者
TLS 1.0: 1999 年 - 由于 Netscape 的影响力下降,互联网工程任务组(IETF)将 SSL 标准化,并改名为 TLS。TLS 1.0 可以看作是 SSL 3.1(内部版本号确实是 3.1),它修复了 SSL 3.0 的一些漏洞。
TLS 1.1: 2006 年 - 主要增加了一些保护措施来应对新发现的攻击方式(如 CBC 攻击)。
TLS 1.2: 2008 年 - 这是一个重大更新。它支持了更强大、更现代的加密算法(如 SHA-256 哈希函数、AEAD 加密模式如 GCM)。在很长一段时间里,这是安全标准的主流和黄金选择。
TLS 1.3: 2018 年 - 另一个巨大飞跃。简化了握手过程(更快),移除了一系列陈旧和不安全的加密算法(更安全),并且设计上更加注重隐私和安全。这是当前推荐的最新和最安全的版本。
- HTTPS 的普及
虽然 HTTPS 从一开始就存在,但它的大规模普及主要发生在 2010 年代中后期。
推动力包括:Let's Encrypt(2015 年成立)提供免费证书,谷歌在搜索引擎排名中优先推荐 HTTPS 网站,以及整个行业对安全和隐私的日益重视。
- Node.js Crypto 模块
2009 年 - Node.js 诞生。其 crypto 模块从一开始就是核心模块之一,因为它直接封装了 OpenSSL 的功能,为服务器端的 JavaScript 提供了至关重要的加密能力。
感谢这些先驱者的贡献!!
最后
回到主题吧,什么是 OpenSSL?
OpenSSL 是一个【开源的】、功能强大的软件库和【工具集】,它提供了全面的【密码学基础功】能和【安全通信协议实现】。
其核心包括对 SSL/TLS 协议的实现,以及各种加密算法(如 AES、RSA)、散列函数(如 SHA-256)【其实就是哈希函数!!!(Hash Function)】和数字证书(X.509)的处理能力。
它被广泛应用于操作系统、Web 服务器、网络设备及应用程序(如 Node.js)中,为网络通信提供加密、解密、身份验证和数据完整性保护,是保障 HTTPS 等安全服务得以运行的底层技术基础。
📚 补充知识 OpenSSL 这么厉害,它有没有啥竞争者呢? OpenSSL 的主要竞争者包括 【LibreSSL】(OpenBSD 为提升安全性而分叉的项目)、BoringSSL(Google 为自身需求定制的分支)以及 GnuTLS。不过,OpenSSL 凭借其悠久历史和广泛集成度,依然是应用最普遍的标准。