在这篇文章中,我们想向您简要介绍 TLS(传输层安全性),这是一种广泛与 PostgreSQL 结合使用的技术,用于加密客户端/服务器连接。
什么是 TLS?
TLS 是“传输层安全”的缩写,它是一种确保通过 TCP 连接发送的任何数据免受攻击者保护的方法。
要了解 TLS 的工作原理,您首先需要了解有关加密的一些知识。
对称加密
如果您有一个文本“我喜欢奶酪”,并将每个字符替换为英文字母表中的下一个字符(将 a 替换为 b,b 替换为 c,...,z 替换为 a),那么您就拥有了基本的对称加密。您可以将消息“ j mjlf diddtf ”传输给您的朋友,他们可以浏览该消息并将每个字符替换为前一个字符(将 b 替换为 a,将 c 替换为 b,...,将 a 替换为 z),然后他们会知道你最喜欢的零食。
从数学上来说,对称加密可以这样表示:
如果 enc(x, k)=e 是使用密钥 k 将 x 加密为 e 的函数,则使用反函数 enc^-1(e, k)=x 使用 k 将 e 解密回 x 。
这是一个极其简单的例子,很容易破解。有很多更复杂的对称加密数据的方法,除非您知道密钥,否则无法破解。对称加密的一个著名例子是第二次世界大战期间使用的 Enigma 机器。虽然恩尼格玛 (III) 加密在第二次世界大战后期是可以破解的,但更先进的恩尼格玛 (IV) 直到今天仍然难以破解。
对称加密有两个实用性问题
一方面,您需要许多不同的密钥(本质上每个连接一个),因此客户端 B 无法解密服务器发送给客户端 A 的任何内容。另一方面,没有简单的方法可以将密钥本身安全地传递给新客户端。
当您管理两台相互通信的服务器时,这不是问题,因为它们都受到高度信任,并且连接不会经常更改。您的客户(您对其硬件和软件几乎没有控制权)无法得到同等程度的信任,并且可能会定期添加新客户。
因此,为了让客户端能够发送和接收加密消息,您需要一些不同的东西。
非对称加密
非对称加密的基础是私钥和公钥的原理,私钥和公钥一起称为密钥对。两者通常都源自同一组随机数,虽然公钥可用于加密数据,但只有私钥可用于再次解密。
这意味着您可以将您的公钥交给任何人,以便他们可以加密他们想要发送给您的内容,并且只有您才能使用私钥对其进行解密。
从数学上来说,非对称加密可以这样表达:
如果 enc(x, k_pub)=e 是使用公钥 k_pub 将 x 加密为 e 的函数,则使用函数 dec(e, k_priv)=x 来解密 e ,使用私钥 k_priv,返回到 x。
就像对称加密一样,有些非对称加密的安全性不如其他加密,但我们现在不需要担心这一点。
重要的是我们有一种发送加密数据的方法,而不必信任客户端拥有我们的密钥。
签名验证
非对称加密的另一个好处是它不仅可以用于加密,还可以为数据添加签名。发送者可以计算数据的校验和并使用其私钥对其进行加密以生成签名。接收方计算相同数据的校验和,并将其与发送方的校验和进行比较,后者是使用公钥从签名中解密的。
TLS 是如何工作的?
TLS 使用非对称和对称加密的混合。请记住,对称加密理想情况下每个连接都需要不同的密钥,并且密钥交换很难安全地进行。但与此同时,与非对称加密相比,对称加密更容易计算(即更快、更便宜),并且仍然提供类似的安全性。
因此,非对称加密仅用于初始握手,以派生或交换随机密钥,该随机密钥将用于对称加密连接的其余部分。
有两种创建和交换随机密钥的方法:
- 客户端随机生成密钥并使用服务器的公钥对其进行加密。在这种情况下,密码会被加密发送到服务器。
- 双方同意一个随机值,并使用该随机值、自己的私钥和另一方的公钥导出共享秘密。此计算可以在两侧完成并产生相同的密码,因此密码本身永远不需要传输。(这称为 Diffie-Hellman 密钥交换)
第二种方法仅在双方都有密钥对时才有用。
当您从计算机访问网站时,通常使用第一种方法,因为您无需拥有密钥对即可访问 HTTPS 加密的网站。
如何使用非对称加密进行身份验证?
如果您已经知道给定服务器的公钥,那么您可以挑战他们以测试它们是否确实具有匹配的私钥。使用已知的公钥,您可以加密随机消息并将其发送到服务器,要求它为您解密。如果已知的公钥与服务器中安装的私钥匹配,那么服务器发回的解密消息也将与您最初加密的随机消息匹配。
这意味着您可以相信服务器是真实的 - 否则,它不应该拥有与您已知的公钥相匹配的私钥。这就是 ssh 文件的工作原理known_hosts
。
然而,还有另一种方法可以验证对方的身份。当您浏览网页时,您没有互联网上每台服务器的已知公钥列表。
因此,在第一次连接时,服务器会向您发送其公钥。但是您如何确定该密钥实际上属于您期望的服务器呢?毕竟,您可能尝试访问www.myimaginarydomain.com
,但攻击者可能会将您的呼叫转移到他们自己的服务器。
这个问题的解决方案很简单:
的操作者www.myimaginarydomain.com
可以使用由私钥签名的公钥,该私钥的公钥已安装在您的系统上。这些公钥称为“证书颁发机构”(CA) 证书。但有时情况会更复杂,因为 CA 证书本身几乎从不用于直接签署“最终用户”证书,而是用于签署中间证书,并且可以验证整个链。
例如,证书www.myimaginarydomain.com
可能由“Imaginary Corporation CA”签署,该证书可能由“Imaginary Global Trust Corporation”签署。如果“Imaginary Global Trust Corporation”的证书是您的系统或浏览器证书库的一部分,那么服务器传送的证书www.myimaginarydomain.com
将受到您的系统的信任。
最后,只有当其他方的地址与证书中包含的地址匹配时,连接才会受到信任。如果www.myimaginarydomain.com
使用证书,www.notmyimaginarydomain.com,
则不会建立连接。
TLS 领域的术语
虽然很容易将我们刚刚讨论的所有内容视为公钥和私钥对(事实上,除了一点点元数据和签名之外,也仅此而已),但有些术语经常出现在 TLS 上下文中使用。
- 公钥通常称为“证书”——有服务器证书,可用于识别服务器并向其发送加密消息,也有客户端证书,可用于执行相同的操作,但所有内容都可以使用朝着客户的方向前进。
- TLS 上下文中的私钥通常简称为“密钥”。
- 签署其他证书的实体(公司或个人)称为证书颁发机构 (CA);如果您信任此 CA,则可以信任他们签署的证书。
- 属于 CA 用来签署其他证书的私钥的公钥称为 CA 证书。
- 为了让证书由 CA 签署,用户创建一个密钥和一个证书签名请求 (CSR) – CSR 包含公钥以及该证书应使用的域名或 IP 地址。
- 将使用该证书的服务器的域名或 IP 地址包含在证书的公用名 (CN) 字段中。对于客户端证书,CN 通常包含用户名。