假设我有一个网站,我希望用户能够使用客户端证书登录。据我了解,客户端向网站提供密钥对的公钥部分,并证明他们拥有相应的私钥部分。这样对吗?如果是这样,那么检查客户端是否提供已知(先前授权)的公钥是否足以知道它是已知用户,而无需证书由受信任的 CA 签名?
答案1
使用客户端证书身份验证时,在握手结束时,客户端会发送一个Certificate Verify
TLS 消息它使用其私钥对客户端和服务器之间交换的所有 TLS 消息的串联进行签名:这是双方都知道的事情。
这与客户端证书是否受信任无关。服务器仍需根据客户端证书中提供的公钥验证签名。如果验证失败,则握手失败。
在握手结束时,无论服务器是否信任证书所断言的内容,即公钥、标识符和其他各种属性之间的绑定,它至少会知道客户端拥有此证书中公钥的私钥(其余的可能是也可能不是真的)。
如果您有预定义的已知公钥列表(例如,类似于为 SSH 连接设置的公钥),则可以通过这种方式执行身份验证。您错过的是 PKI:帮助您管理密钥及其所属者的整个基础架构。由于大多数配置设置都旨在在 PKI 中使用,因此这可能还需要更多工作(可能包括额外的编程)。
TLS 连接的所有其他属性均完好无损:加密仍然以与 PKI 上下文中相同的方式得到保证。我不确定 @WesleyDavid 在回答这个问题时在说什么。无论如何,这是关于客户端证书的,因此无论是否提供客户端证书(当然,前提是使用具有非空加密的密码套件),客户端和服务器之间的加密都会发生。
答案2
当然,您可以这样做,但您会失去 CA 的好处。CA 的好处是您只需要知道 CA,而不需要事先单独了解每个客户端。如果您使用仅识别密钥的方案,则需要在服务器中单独配置每个密钥。如果您只想知道它是同一个用户,那么您只需确认它是同一个公钥即可。
答案3
当然,你能这样做的方法是让客户端对每个证书进行自我签名,并手动信任其中的每一个证书作为自己的根 CA,而不是让受信任的 CA 对其进行签名。
但这样做真的没什么意义——听起来你的客户有由受信任的 CA 签名的证书。您只是想避免信任关系验证步骤吗?
你能解释一下你想要达到什么目的吗?
答案4
假设我有一个网站,希望用户能够使用客户端证书登录。
需要明确的是,我们正在讨论使用证书登录,而不是谈论任何加密主题。
据我了解,客户端向网站提供密钥对的公钥部分,并证明他们拥有相应的私钥部分。对吗?
对于密钥对认证来说这是正确的。
如果是这样,那么检查客户端是否提供已知(先前授权的)公钥是否足以知道它是已知用户,而无需证书经过受信任的 CA 签名?
只要知道尝试进行身份验证的客户端拥有私钥(如果私钥密码受到保护,可能还有私钥密码)就足够了。只要这仅用于身份验证而不是加密,您就无需担心证书颁发机构。您只需要收集公钥并根据这些密钥适当地委派权限。