【发布时间】:2010-12-12 17:03:36
【问题描述】:
我在 X 公司工作,我们想与 Y 公司进行 B2B 交易。这样做时,Y 需要客户端身份验证;他们已经提供服务器端身份验证 - 所以这将是一个相互 SSL 事务。
我的理解是,我只需要提供我的 CA 签名证书作为客户端 HTTPS 通信的一部分。在这样做时,非对称加密保证(即公钥/私钥技术)确保我是我声称的那个人——实际上,不可能冒充我。 (根 CA 确保了我就是我,这就是他们签署我的证书的原因,并且可以证明我没有“制造”证书)。
这是我的问题:我需要为 Y 公司提供这些吗?
或者,我是否必须提前向他们提供 另一个 密钥,以便他们可以确保我不是碰巧“获得”根签名证书的流氓我(X公司)?似乎如果必须向他希望在客户端参与的所有各方提供这个额外的密钥,这似乎会使客户端 SSL 不像服务器端 SSL 那样可扩展。我的猜测是,不可能“获得”客户端证书。客户端证书的实际传输由事务的某些状态进一步编码(这不是逆向工程的,但可行)。
这有意义吗?我是对还是错?如果我错了,Y 实际上是否需要从连接到它的每一方那里获得一个“额外的”预通信密钥? (他们想要验证)?
谢谢。
===
感谢下面的回复,到目前为止,至少前两个有帮助(其他人可能会稍后到达)。
让我更详细地谈谈我的技术问题。
假设 Y 公司试图“重复使用”我的客户端证书来冒充我与另一家公司(例如“Z”)进行另一次客户端交易。这甚至可能吗?我在想 - 再一次,也许说得不好 - 客户端证书的传输的某些部分可以防止整个密钥被泄露,即“重用”在技术上是不可行的收到客户端证书,因为您无法(可行)对与客户端证书进行通信的通信进行反向工程。
如果不是这样,Y 不能重用证书,在与 Z 通信(客户端)时冒充 X 吗?
ps:我意识到安全性永远不会 100%,只是想了解这里在技术上什么是可行的,什么是不可行的。
非常感谢!
===
更多技术细节,我非常感谢任何额外的输入 - 这非常有帮助。
从外行的角度来看,我关心的是当客户发送他的客户证书时,他发送的是什么?好吧,他必须使用他的私钥加密该证书。他用公钥发送密文,然后接收方可以使用该公钥解密私钥编码的有效载荷,对吗?这是有道理的,但我想知道——是什么阻止了某人听到该通信并在重放攻击中简单地重新使用私钥编码的有效负载。只需重播发送的确切 1 和 0。
这是我认为可以防止这种情况发生的原因——它可以在 TLS RFC 中的多个地方找到,但例如在 F.1.1 中:
F.1.1。身份验证和密钥交换 TLS 支持三种认证方式: 两种认证方式 各方,使用未经身份验证的客户端进行服务器身份验证,以及 完全匿名。每当服务器通过身份验证时,通道就是 防止中间人攻击,但完全匿名 会话本身就容易受到此类攻击。匿名的 服务器无法验证客户端。如果服务器经过身份验证, 其证书消息必须提供有效的证书链 导致可接受的证书颁发机构。相似地, 经过身份验证的客户端必须向客户端提供可接受的证书 服务器。每一方都有责任核实对方的 证书有效且未过期或被吊销。 密钥交换过程的总体目标是创建一个 pre_master_secret 为通信双方所知,而不是 攻击者。 pre_master_secret 将用于生成 master_secret(参见第 8.1 节)。 master_secret 是必需的 生成证书验证和完成消息,加密 密钥和 MAC 机密(参见第 7.4.8、7.4.9 和 6.3 节)。通过发送 正确完成的消息,各方因此证明他们知道 正确的 pre_master_secret。我相信与会话相关的随机化可以防止这些重放攻击。
听起来是对的还是我进一步混淆了事情?
【问题讨论】:
-
几乎正确 --- 每次握手中都有随机化以防止重播。客户端通过数字签名某些会话独有的内容进行身份验证。请参阅我的答案的更新以获得更完整的解释。
标签: authentication ssl certificate client-side