假设我有一个网站,我希望用户能够login到客户端证书。 据我了解,客户正在向公众展示一个密钥对的一半,并certificate他们有相应的私人一半。 那是对的吗? 如果是这样,那么是不检查客户端是否提供足以知道它是已知用户的已知(先前授权的)公钥,而没有证书已经由可信CA签名?
当您使用客户端证书身份validation时,在握手结束时,客户端发送Certificate Verify TLS消息 ,在该消息中用私钥对客户端与服务器之间交换的所有TLS消息进行串联:常见的两者皆知。
这与客户证书是否信任无关。 服务器仍然根据客户端证书中提供的公钥validation签名。 如果失败了,握手就会失败。
在握手结束时,服务器是否信任证书所声明的内容,即公钥,标识符和各种其他属性之间的绑定,至less知道客户端拥有公钥的私钥input这个证书(其余的可能不一定是真的)。
如果您有一个预定义的已知公钥列表(类似于您为SSH连接设置的公钥),则可以使用这种方式执行身份validation。 你错过的是PKI:帮助你pipe理密钥和他们所属的整个基础设施。 由于大多数configuration设置是为了在PKI中使用,所以这可能还需要更多的工作(也许包括额外的编程)。
TLS连接的所有其他属性都是完好无损的:encryption仍然以与在PKI上下文中相同的方式得到保证。 我不确定@WesleyDavid在这个问题上的回答是什么。 无论如何,这是关于客户端证书的,所以客户端和服务器之间的encryption无论如何都会发生,不pipe客户端证书是否出现(当然提供了使用非空密码的密码套件)。
当然,通过让客户自行签署每个证书并手动将每个证书作为自己的根CA,而不是由可信任的CA进行签名,您可以这样做。
但是这样做确实没什么意义 – 听起来就像有客户拥有由受信任的CA签名的证书。 你只是试图避免信任关系validation步骤?
你能澄清你想达到什么吗?
假设我有一个网站,我希望用户能够login到客户端证书。
清楚的是,我们正在谈论使用证书login,而不是谈论任何encryption主题。
据我了解,客户正在向公众展示一个密钥对的一半,并certificate他们有相应的私人一半。 那是对的吗?
这对于密钥对validation是正确的。
如果是这样的话,那么是不检查客户端是否提供足以知道它是已知用户的已知的(先前授权的)公钥,而没有证书已经由可信任的CA签名?
知道试图进行身份validation的客户端具有私钥就足够了(如果受到这种保护,私钥也可能是私钥密码)。 只要这只是用于身份validation而不是encryption,则不需要担心证书颁发机构。 您只需要收集公钥并根据这些密钥进行适当的授权。
当然,你可以做到这一点,但是你失去了CA的好处。 CA的好处是您只需要知道CA,您不需要事先知道每个客户。 如果您使用只识别密钥的scheme,则需要单独configuration服务器中的每个密钥。 如果你只是想知道它是同一个用户,那么你可以确认它是相同的公钥。