第零章:介绍

在我讨厌信息技术的无数事情中,一等奖是“安全”这个词。不是它背后的概念,而是实际的词。“安全”的定义在字典中摇摆不定,取决于谁在说话、谁在听、上下文以及与最近的暴力小队的距离。这是一种超然的状态,每个人都完全不受任何人的伤害,但一点也不麻烦、不吓人或不可理解。安全是快乐乐园,每个人每天都会吃热软糖圣代,而不会患上糖尿病或体重增加一克。

使这个词稍微有意义的唯一方法是严格定义上下文。

这是传输层安全(Transport Layer Security——TLS)的一个优势。它所保护的是正确的名称。即便如此,它还是被误解了。它并不能使web服务器安全。网络浏览器地址栏中的那个小盾牌图标并不意味着你的信用卡信息最终不会被用来购买骆驼色情制品。TLS在传输过程中加密网络连接。就是这样。它不能保护客户端或服务器免受攻击者的攻击。它并不能阻止骗子欺骗你的个人数据。它甚至不能完全保证你在你认为的网站上。保护传输中的数据至关重要。虽然它最出名的是网站,但TLS感知应用程序可以将TLS应用于任何TCP或UDP网络连接。

TLS也很难理解。大多数系统管理员都知道他们获得了证书,并将其安装到位,魔术就会发生。那些证书过去很贵。在过去的二十年里,价格下降了,今天你可以免费得到它们。有时你仍然想要一张昂贵的证书,但我们大多数人不知道何时或为什么需要这笔费用。

即使有免费证书,我仍然不喜欢TLS。这当然不是那种作者被技术迷住了,以至于你怀疑它是否会变成一本接吻书的书。但是TLS是普遍的、令人沮丧的和复杂的。理解是我们应对它的唯一方法。

第零章:介绍谁应该读这本书?TLS、SSL和版本为什么是 TLS?使用 openssl(1)OpenSSL手册美国和 FIPS应用程序和TLSTLS 对比 DTLS加密与本书这本书里有什么

谁应该读这本书?

TLS Mastery是为管理使用TLS构建的应用程序的Unix系统管理员以及在任何平台上使用OpenSSL命令的任何人编写的。我假设您对命令行、脚本、权限管理和其他标准Unix功能感到满意。

我的参考平台是FreeBSD、OpenBSD、Debian和CentOS。你的Unix越接近其中之一,你的时间就越容易。如果你运行一个不太常见的Unix,大概你熟悉它的特性。特别是,MacOS提供了一个精简的OpenSSL客户端,缺少这里讨论的许多功能。对于MacOS上的实际工作,您可能需要一个附加的备用OpenSSL。

在众多ACME实现中,本书使用 dehydrated (https://dehydrated.io)。dehydrated 所证明的原则应适用于任何其他客户。我使用Apache 2.4来展示某些 dehydrated 组件的工作原理,但其他web服务器也能正常工作。对于DNS相关的示例,我使用BIND 9.16,但任何支持动态更新(RFC 2136)的名称服务器也可以工作。

我的参考TLS工具包是OpenSSL,版本1.1.1【注:2021年4月发布的FreeBSD13采用的是1.1.1版,2023年11月发布的FreeBSD14采用的是3.0】。我也使用LibreSSL,OpenBSD经过精心审核的OpenSSL分支,但它保留了与OpenSSL命令行的兼容性。除非另有说明,否则任何涉及OpenSSL的内容也适用于LibreSSL。讨论的原则也适用于其他TLS工具包,如GnuTLS,但我没有演示它们。如果你能在你的平台上构建一个功能强大的OpenSSL或LibreSSL,它应该可以工作。

OpenSSL不仅适用于TLS;它是一个通用的加密套件。它的命令行是复杂的,部分原因是加密是复杂的。它也很复杂,因为它起源于1995年,并试图保持向后兼容性。我无法让你对OpenSSL命令行感到满意,但我可能能够减少你在与它交互时所经历的眩晕感。

可能。

TLS、SSL和版本

你听说过SSL连接和证书,以及TLS连接和证书。有什么区别?

数字证书(digital certificate)是一组经过精心格式化的信息,用于标识一个实体,并由证书颁发机构进行数字签名。一个自己签名的证书被称为自签名证书(self-signed cetificate),在互联网上相当于一个英俊的王子微笑着说:“相信我。”也许你可以信任他,或者你已经被背叛了。服务器、服务和用户都可以拥有证书。我们将在第3章深入探讨证书。证书是SSL和TLS的关键组成部分。

安全套接字层(Secure Sockets Layer —— SSL)是早期的传输层安全协议。网景公司希望能够加密网络服务器和他们漂亮的新图形浏览器之间的流量,因此在1994年,他们创建了原始SSL,并让一小群人对其进行测试。它有点奏效,它让测试人员尝试电子商务,但与单个机构设计的任何协议一样,它也有许多缺陷。1995年,Netscape匆忙发布了稍微更强大的SSL版本2,随后在1996年发布了版本3。尽管有这么多版本,SSL的核心加密设计本质上存在无法弥补的缺陷。

IETF于1999年发布了传输层安全(Transport Layer Security —— TLS)的第1版。它是SSL版本3的直系后裔,但由于政治原因更改了名称。TLS 1.1在2006年发布,1.2在2008年发布,1.3在2018年发布。

SSL版本2在2011年被完全淘汰,版本3在2015年被淘汰。今天的互联网上不应该使用任何版本的SSL。同样,TLS 1.0和1.1从2010年左右开始越来越不受欢迎,2018年几乎完全弃用。如第1章所述,这些协议版本非常危险,不得使用。

截至2020年,所有互联网网站都应该使用首选TLS 1.3版本,只有在必要时才回落到1.2版本。2021年初,美国国家安全局和其他几个政府的安全机构强烈建议放弃TLS 1.2。

如果SSL不再是一种有效的协议,并且已经多年没有使用了,为什么我们一直听说它?语言的发展速度比技术慢。即使是只运行TLS的系统管理员也一直称之为SSL。用户已经学会了这个缩写词,一旦用户认为他们理解了他们讨厌的东西,就会更新他们的知识。那些指出这是TLS而不是SSL的人会被斥为学究,失去朋友。此外,使用最广泛的TLS软件工具包名称中包括SSL。如果不是技术问题,我们也会被这些信件所困扰。

除非我特别指的是古老的、被禁止的协议,否则我不会再提到SSL。

为什么是 TLS?

互联网有一个完整的安全传输协议市场。IPSec。Wireguard(窃听器)。OpenVPN。一些协议已经被放弃。协议已经合并,演变为派系,几乎是剑拔弩张。是什么让TLS变得特别,为什么它幸存下来?

TLS是用于包装单个TCP/IP连接的通用协议。在IPSec等解决方案可以隧道和加密两个IP地址之间的所有流量的情况下,TLS只加密单个连接。

TLS可以相对简单地添加到现有协议中。Netscape希望现有的网站能够迁移到机密和防篡改的传输方式,而无需重新设计HTTP协议。他们使SSL尽可能不引人注目,TLS仍然优先考虑该功能。

最后,开发人员可以在他们的应用程序中完全管理TLS。无需与主机的IPSec或OpenVPN功能进行协商。开发人员不必玩路由、网络或任何可怕的东西的游戏。如果你要将软件从Unix移植到Linux、Windows、MacOS或其他任何平台,传输安全并不是这项工作中最困难的部分。

最后,TLS有点机会主义。客户端可以检查服务的TLS,并在可用时使用它。客户端不需要特殊设置,除非您使用更复杂的功能,如客户端证书身份验证。

使用 openssl(1)

Unix传统上由一堆小程序组成,每个程序处理一个简单的任务。OpenSSL(以及LibreSSL等分支)对 openssl(1) 采取了不同的方法。openssl(1) 命令是一个通用工具,用于所有加密和许多无关的事情。它可以创建密钥对、对文件进行数字签名、解析ASN.1和X.509、生成随机数和验证TLS证书。

密码学是出了名的令人困惑,正如算子代数(operator algebra)、多变量微分方程(multivariable differential equations)和宇宙学(cosmology)是出了名地令人困惑一样。密码学确实很难,通常大多数系统管理员都不理解。更糟糕的是,许多人声称他们理解。掌握密码学需要一生的时间。这是一个相对便宜的爱好,可以拓展你的大脑,而且比每个周末建造模型火箭占用的空间要小得多。除了开发人员的任何设计决策外,OpenSSL还继承了密码学的复杂性。

openssl命令的格式如下:

$ openssl subcommand flags

子命令(通常简称为命令)定义了您正在使用的加密函数。子命令 genrsa 创建RSA密钥,而 x509 处理X.509证书。仔细阅读 openssl(1) 手册页会让理解所有这些操作看起来像是爬上了疯狂的悬崖,但我们会尽可能地让它变得无痛。

许多子命令共享类似功能的公共标志(common flags)。您将看到用于输入和输出的 -in-out 标志,用于文本格式的 -text 标志,等等。大多数Unix命令使用单字符标志,并允许将它们相互堆叠,例如 tar -czvf ,OpenSSL要求您分别输入每个标志。我不知道用 -i-o 替换 -in-out 会对提高这些命令的可读性有多大帮助。加密操作本质上是复杂的,增加的可读性可以说是一种双赢。

要查看您拥有的OpenSSL版本,请运行 openssl version

要获取有关Unix如何打包和配置OpenSSL的更多详细信息,请使用 openssl version -a

许多OpenSSL命令被设计为相互馈送,就像这样:

openssl s_client 命令充当一个支持TLS的netcat,与您指定的主机和端口协商TLS连接。这个命令通常会等待输入,但我们给它输入 /dev/null ,这样它就不会等待了。-showcerts 选项显示证书信息,-connect 允许您选择目标。我们将其导入X.509解析器openssl x509 ,使用 -text 指定我们想要人性化的输出,并使用 -noout 跳过显示编码证书。

此组合获取网站的TLS证书并显示内容。这在Unix中相当于点击浏览器地址栏中的锁图标,然后浏览几层菜单以找到“显示证书”。

OpenSSL手册

OpenSSL是一个巨人。相应地,这本手册相当庞大。较旧版本的OpenSSL将该命令的所有文档放在一个巨大的手册页 openssl(1) 中。较新版本的OpenSSL将手册拆分为几十个较小的手册页,每个命令对应一个。openssl version 的文档出现在 openssl-version(1) 中, openssl pkeyparam 记录在 openssl-pkeparam(1) ,以此类推。很多时候,这些较小的手册页由子命令和全名索引;您可以键入 man pkeyparam 而不是 man openssl-pkeyparam 。(一些Linux系统不提供以openssl为前缀的手册页版本;它们仅以 man x509man pkeyparam 等形式提供。)

你的系统使用什么?运行 man openssl-version ,查看页面是否存在。

哪个系统更好?我有我的偏见,但任何安排这么多文件的选择都会惹恼别人。理想的解决方案是升职,这样你就可以将所有TLS问题委托给其他人。

本书遵循较新的OpenSSL标准,每个子命令都有单独的手册页。

美国和 FIPS

加拿大和美国的许多组织必须遵守美国联邦信息处理标准(Federal Information Processing Standards —— FIPS),这是一套密码学要求。目前的标准是FIPS 140-3,但许多组织仍然使用140-2。它通常被称为“FIPS 140”。FIPS规定了组织可以使用哪些加密算法、必须如何处理数据、如何测试软件以及可以使用哪些实现。

受FIPS约束的组织因违反该标准而受到严厉处罚。如果你为这样的组织工作,FIPS合规性将优先于我的任何建议。如果你是你的雇主失去所有政府合同的原因,那么你可能会被毫不客气地拖到董事会面前。

“FIPS合规性”(FIPS compliance)这一短语激励供应商和组织达到新的高度。他们可能会声称他们的解决方案符合FIPS标准,但他们的意思是他们的开发人员阅读了标准并实现了这些算法。该解决方案可能看起来像FIPS,它可能与FIPS互操作,但尚未经过审核、验证和批准。您可以在以下网址在线找到经批准的加密引擎列表:https://csrc.nist.gov/projects/cryptographic-module-validation-program/validated-modules/search/all

OpenSSL可以按照FIPS标准构建。每个单独的软件版本都必须进行合规性测试。操作系统还需要特定的FIPS配置,但符合FIPS的软件构建可以清除其中一个大障碍。Red Hat发布了FIPS批准的OpenSSL,以及GnuTLS和内核加密引擎。

FIPS限制了受TLS保护的服务可以使用的算法。是的,密码学的发展速度比政府标准快,你可能会发现自己在次优算法之间做出选择。也许IETF或OpenSSL或任何推出一套时髦的新算法的人,但如果它不在FIPS批准的列表中,你就不能使用它。

符合FIPS标准的站点可以选择不使用所有允许的算法。在我写这篇文章的时候,SHA-1在FIPS的允许列表上。多年来,SHA-1一直被认为是一种危险的弱数字签名算法,最近的事件将其添加到了系统管理员需要尽快反复稳定和埋葬的事项列表中。(对于某些用途来说,这是可以的,但如果你不确定是哪种用途,就放弃它。)在TLS配置中禁用SHA-1不会违反FIPS。启用更强大但未经批准的算法却会违反。

在接触任何东西之前,一定要咨询贵组织的加密官员(Cryptography Officer,美国政府对FIPS合规官员的授权头衔)。他们可以为您提供其组织的配置标准。跟着他们。你正在处理FIPS标准,你对它的解释,密码官员的解释,更糟糕的是,审计员的解释。这些不一样。尽你所能提出最好的论点,但要记住,你不是必须面对审计员的人。在这种环境中,FIPS合规性比系统或连接完整性更重要。

NIST的文件《传输层安全(TLS)实现的选择、配置和使用指南》是一份有用且可读的(政府标准)指南。

如果你不在美国,不要以为自己自由了就跳舞。其他国家有自己的标准。有些是基于FIPS的。其他人,比如俄罗斯的GOST,则完全不同。他们都有一个共同点,那就是相关政府非常重视他们。

应用程序和TLS

每个应用服务器都以不同的方式配置TLS。我选择作为参考的任何应用程序都与我90%以上的读者无关。除了演示核心功能所需的示例外,我很少提供特定于应用程序的示例。

我将提供各种组件在TLS中扮演的角色。如果您的证书颁发机构提供证书和中间证书包,您将了解这些项目在整个TLS过程中的作用。这使您可以查看应用程序文档并了解如何配置这些组件。您将了解应该支持哪些版本的TLS;您的应用程序手册将告诉您如何禁用其余部分。

TLS 对比 DTLS

互联网的两个主要传输协议是传输控制协议(Transmission Control Protocol —— TCP)和用户数据报协议(User Datagram Protocol —— UDP)。我应该解释一下——不,太多了。让我总结一下。

在TCP中,主机的网络堆栈知道连接的状况。它知道发送和接收了哪些数据包,并请求或重新发送任何丢失的数据。这就是为什么我们称TCP为连接协议。在TCP上运行的应用程序包括HTTP和HTTPS、SMTP、SSH和FTP。

使用UDP,主机的网络堆栈会随意地在互联网上发送数据包。他们到了吗?他们在途中消失了吗?谁在乎?应用程序会处理所有这些。至少部分依赖UDP的应用程序包括SNMP、DHCP、DNS和文件共享。许多VPN只使用UDP。如果你需要更多细节,可以看看一本关于网络的书,比如我的《Networking for Systems Administrators》(倾斜风车出版社,2015)。

TLS期望网络处理数据包传递,包括处理任何重传和重新排序等。这意味着它只在TCP上运行。

不过,许多UDP应用程序也需要传输保护。人们没有发明一个全新的协议,而是采用了TLS并添加了一个状态跟踪系统来处理所有的网络计费。结果就是数据报传输层安全(Datagram Transport Layer Security —— DTLS)协议。

DTLS被有意设计为与TLS完全一样工作。代码不同,数据包结构也不同,但对于系统管理员来说是一样的。TLS证书在DTLS中运行良好。您所有的TLS知识都完全适用于DTLS。您仍然无法通过telnet连接到受DTLS保护的服务。甚至协议版本号也被故意同步:DTLS 1.3使用与TLS 1.3相同的机制。

如今,DTLS主要用于VPN产品。我们不会过多讨论,但不要让这个缩写词困扰你。

加密与本书

TLS是基于加密构建的。加密是建立在数学之上的。由才华横溢的人开发的非常复杂的数学,并不断被那些非常聪明的人检查、验证和攻击。

我不是这些人中的任何一个。

很可能你也不是。

对我们来说,密码学就像魔法。为什么1024位ECDSA密钥比1024位RSA密钥更难破解?当然计算哈希冲突不是那么难吗?公钥密码学到底是什么?

如果你对密码学的内部很感兴趣,这本书不会让你满意。我将向您展示如何配置和使用TLS,但我们都需要接受密码学的神奇数学原理。许多人发现密码学研究是一项具有挑战性的脑力拓展爱好,如果你对此感兴趣,我鼓励你阅读任何数量的关于这个主题的书籍和网站。我们其他人必须接受密码学是有效的,就像我们接受CPU、内存和网卡是有效的一样,即使我们对它们内部的情况一无所知。

这本书里有什么

TLS已经存在了近三十年,并且已经融入了互联网生态系统的许多角落。这本书不会教你关于TLS的所有知识。没有一本书可以。

这本书将为您提供每个系统管理员必须了解的TLS的坚实基础。您将深入了解自动化证书管理环境(Automated Certificate Management Environment —— ACME)。您将学习如何使用OpenSSL命令行执行典型的TLS操作。更重要的是,您将学习何时使用TLS,何时不重要。这些知识将使您能够安全地穿越您所站的任何TLS平台。

那么,我们将报道什么?

本书的前半部分是关于TLS的原理。我们将讨论密码学和证书、STARTTLS、信任树和TLS恢复等协议。下半部分将更深入地介绍证书颁发机构和自动化证书管理环境。

然后是 Afterword 、学分、索引等等。

首先,让我们谈谈代码和密码。