我知道一个事实,即 SSL\TLS 会话可能在没有 SSL 证书的情况下继续,这意味着您传递加密数据,但您没有真正与谁合作的坚实基础。
这是如何进行的?
使用 PuTTY 连接到端点时的 SSL 通信过程与我在安全会话上与 Web 服务器通信时的 SSL 通信过程是否不同?
我知道一个事实,即 SSL\TLS 会话可能在没有 SSL 证书的情况下继续,这意味着您传递加密数据,但您没有真正与谁合作的坚实基础。
这是如何进行的?
使用 PuTTY 连接到端点时的 SSL 通信过程与我在安全会话上与 Web 服务器通信时的 SSL 通信过程是否不同?
SSL/TLS从一个叫做握手的过程开始,在这个过程中,客户端和服务器就他们将使用的加密算法达成一致(密码套件),并使用一些非对称加密魔法来建立一个共享秘密,在会话期间,将用于对随后交换的应用程序数据进行对称加密和完整性检查。
通常,“密钥交换”位假定:
关于服务器证书的难点在于服务器需要将他的公钥放在客户端将接受的证书中。由于客户端接受基于其签名的证书,以针对有限的一组先验已知的公钥(“根证书颁发机构”的密钥)进行验证,因此只能通过询问所述证书颁发机构来获得适合验证的证书. 大多数 CA 只会以一定的价格执行此操作(StartSSL将免费执行此操作)。如果您控制客户端代码,事情会更简单,因为您可以在客户端中添加自己的“根证书”,并且实际上管理自己的 CA 并颁发自己的证书。这仍然是密钥管理(可怕的公钥基础设施),因此需要非零成本。
您可以通过两种方式执行“无证书”SSL:
您可以使用“DH_anon”密码套件之一。这些是客户端和服务器都同意根本没有证书的密码套件;密钥交换依赖于Diffie-Hellman密钥交换。大多数客户端实现(阅读:Web 浏览器)都可以支持它,但默认情况下它经常被禁用。
您可以让您的服务器将他的公钥作为假证书发送。证书只是一种容器格式;只要您在“签名”字段中放置大约正确长度的字节序列,它就会符合格式(传统上,我们使用“自签名”证书——就好像服务器是它自己的 CA——但是任何垃圾字节序列都可以)。当然,客户端将不再能够验证证书。网络浏览器会大声抱怨可怕的警告。
您可能会注意到,虽然 Web 浏览器会在看到自签名证书时大喊大叫,但它也会允许(在单击几次“我知道我在做什么”按钮后)安装“例外”,客户端接受使用该未经验证的证书。例外的好处是它可以永久化:服务器存储有问题的证书的副本,并且下次客户端连接到同一台服务器并且服务器发回相同的证书时,客户端不再抱怨。对于已安装的异常,存在一个弱点窗口(即,当用户决定“安装异常”时:那时,他并不真正知道证书是正确的,还是干预攻击者的证书),但之后安全性恢复。
(通过安装异常来训练你的用户绕过可怕的警告仍然是一个质量有问题的想法。)
Putty不是 SSL 客户端;它使用SSH协议,它在概念上类似于 SSL 协议,但实际上不同于 SSL 协议。SSH 协议是无证书的,因为它依赖于与我上面描述的具有自签名证书和安装异常的模型相同的模型。第一次连接到给定服务器时,SSH 客户端(Putty)会在接受服务器公钥之前要求确认,通常会显示公钥的“指纹”(哈希值),以便您可以将该指纹与期望值(你知道“带外”,例如你背诵它,或者你打电话给系统管理员,他为你拼写出来)。然后 SSH 客户端将永久记录公钥,不再要求确认 - 但如果给定突然使用不同的 公钥,SSH 客户端将比 Web 浏览器面临新的自签名证书时发出更大的哀号。