我正在通过 Java 程序调用 HTTPS URL。我的 Java 客户端是否需要向服务器提供证书才能建立此连接?换句话说,我需要自己的证书还是服务器的证书(包含其公钥)是否足够?
SSL 新手:HTTPS 客户端是否也需要证书?
取决于你在做什么,以及你想要验证什么。如果您正在访问数据,并希望确保知道相应私钥的服务器是向您发送数据的服务器(例如,您正在访问网页),您不需要自己的证书。
如果服务器希望能够验证客户端是预定义的客户端,它知道与被识别为有效来源的公钥相对应的私钥,那么您的客户端将需要证书。这往往在一对服务器进行通信时使用——它们每个都用自己的私钥对数据进行签名,并且可以通过检查公钥来验证数据是否来自已知来源。它也可以与某些 API 一起使用,只有特定的客户端才能访问。
因此,猜测一下,您的客户端不需要自己的证书 - 如果您这样做,服务器通常会很好地记录它。
通常,大多数运行 HTTPS 的 Web 服务器不需要客户端拥有证书。如果服务器要求客户端进行身份验证,这通常通过凭据(例如用户名和密码)来完成。
然而,相反的情况通常不正确——即大多数客户端确实要求 Web 服务器具有由公认 CA 签署的有效证书。检查证书是否有效是客户端的责任 - 否则客户端无法确保它们实际上已连接到它打算连接的服务器,并且它没有被 MITM'd。
不,我已经尝试过了,客户端肯定不需要证书或预定义密钥。
相反,在从服务器接收到公钥(这是证书的一部分)后,客户端会“即时”制作一个秘密,并使用服务器证书中的公钥对其进行加密。作为握手的一部分,客户端将加密的秘密发送到服务器。只要只有服务器拥有与它在证书中发送的公钥相对应的私钥,只有服务器才能解密来自客户端的包含秘密的消息。然后客户端和服务器都使用安全传输的秘密来继续对话。
客户端密钥仅在服务器需要确认客户端身份时才需要;在这种情况下,客户端和服务器可以通过传输使用彼此的公钥加密的消息来进行通信。
您可以通过使用以下 jvm 选项运行代码来看到这一点:
Djavax.net.debug=ssl,握手
客户端和服务器可以就许多不同的密码系统达成一致,通过这些密码系统进行交换,然后使用编造的秘密;在我的测试平台上,它默认为椭圆曲线加密,如在
https://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art060