使用 OpenSSL 进行 SSL 连接是否需要服务器端证书

问题描述 投票:0回答:1

我有一个 C 客户端-服务器模型,它使用 openssl 库建立 SSL 连接。在服务器端,我已将验证模式设置为

SSL_VERIFY_PEER
,因此,客户端证书将根据添加到商店的 CA 在服务器端进行验证。

但是,在客户端,我启用了

SSL_VERIFY_NONE
,因此客户端不会验证服务器证书,并且无论服务器发送哪个 SSL 证书,都会建立 SSL 连接。

但是,当我没有从客户端发送任何证书时,连接不会通过。我收到的错误是 -

  • 在服务器端:
    140510060005296:error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher:s3_srvr.c:1435:
  • 在客户端:
    140575466600368:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:s3_pkt.c:1493:SSL alert number 40

为什么会这样?即使未经验证,服务器是否也必须拥有证书?

c ssl server openssl ssl-certificate
1个回答
0
投票

服务器证书用于验证服务器的身份。验证服务器身份是必须的,否则中间人攻击者可以简单地声称服务器的角色。在这种情况下,从客户端的角度来看,连接仍然会被加密 - 但数据不会与预期的服务器安全地交换,而是与攻击者交换。

虽然还有其他方法可以使用证书来验证服务器身份(如PSK),但这是最成熟的一种。实际使用哪种身份验证方法来验证服务器身份是密码规范的一部分(至少到 TLS 1.2,在 TLS 1.3 中处理方式有所不同)。

客户端将向服务器提供一个密码列表,然后服务器选择它可以支持的一个。通常,客户端仅提供需要基于 RSA 或 ECC 证书的身份验证的密码,因为大多数客户端不支持任何其他类型的服务器身份验证。如果服务器没有配置证书,则它无法支持任何这些提供的密码 - 导致“无共享密码”错误。

SSL_VERIFY_NONE 不会更改客户端提供的密码,它只是不验证服务器证书(正如我已经说过的,这是一个坏主意)。

© www.soinside.com 2019 - 2024. All rights reserved.