相互认证和保密系统

信息安全 密码学 加密 验证 tls 保密
2021-08-19 14:51:16

我正在寻找一种需要在客户端和服务器之间进行相互身份验证的协议。例如服务器应该只连接到一个特定的客户端。也就是说,客户端应该向客户端进行身份验证,并且客户端应该与服务器通信。在此之后,所有的通信都应该被加密。

SSL/TLS 是否可以提供这个?或者有没有一种方法可以让客户端提供密码来向服务器验证自己的身份。

我的主要要求是服务器应该只向特定客户端提供信息。

2个回答

有两种方法可以在 SSL/TLS 中实现相互身份验证:

  • 使用证书。服务器按照惯例在证书中提供他的公钥;客户端根据客户端事先知道的一些根 CA验证服务器证书(这部分是 HTTPS 网站通常发生的情况)。然后服务器可以请求客户端证书,在这种情况下,客户端必须发送证书并执行签名,服务器将使用客户端证书中的公钥进行验证。然后,客户端将使用此证书中写入的任何“名称”进行身份验证。这在TLS 标准的第 7.4.6 和 7.4.8 节中进行了描述

  • 使用SRP这是一种密码验证密钥交换协议,其中客户端和服务器通过共享密钥的知识相互验证。总的来说,PAKE 尤其是 SRP 非常酷的一点是,即使共享密钥的熵很低(例如,这是一个“密码”),该方案也很强大,因为它可以抵抗离线字典攻击的尝试:简单来说,该协议是这样的,如果攻击者想要“尝试”一个潜在的密码,他必须以某种方式与服务器或客户端交互,并且每次尝试都必须这样做。攻击者永远不会获得足够的信息来仅在他自己的机器上检查密码。

SRP 避免了证书的所有模糊事务。不幸的是,SRP 尚未得到广泛支持。GnuTLS是一个开源库,它实现了 SSL/TLS 服务器和客户端,并支持 SRP。

SSL/TLS 将提供此功能,并且可能是使相互身份验证正常工作的最简单方法。这是使用客户端证书完成的。但是,在不知道什么服务器和浏览器软件的情况下,我无法为您指明正确的设置方向。我确实找到了讨论 Apache 的信息