【问题标题】:How can a client use prestored server's certificate to do SSL handshake?客户端如何使用预存的服务器证书进行 SSL 握手?
【发布时间】:2017-10-13 14:40:48
【问题描述】:

我知道在正常的 SSL 握手过程中,客户端收到服务器的证书并进行验证,然后使用服务器的公钥加密会话密钥。

我想在 Linux 上用 C 语言编写一个 SSL 客户端。在 SSL 握手期间,它不必等待服务器的证书,它会发送使用之前已经下载的服务器公钥加密的会话密钥。

我正在学习如何使用 OpenSSL,这里只需要握手部分。

感谢关注。为什么要这样做? ISP 或网关可以审查证书并根据证书中的名称阻止连接。

【问题讨论】:

  • 为什么?你如何告诉服务器不要发送证书?您如何处理更改的证书?对我来说听起来是个坏主意,这可能是XY problem
  • 为了做到这一点,您需要访问客户端和服务器代码,并且一旦实现,此握手将仅在您的客户端和服务器之间起作用,即服务器无法与任何其他通信客户。
  • "客户端如何使用预存的服务器证书进行 SSL 握手?" 直接使用,忽略服务器发送给客户端的内容?
  • "...然后使用服务器的公钥加密会话密钥" - 不会再太久了。 TLS 1.3 中删除了 RSA 密钥传输。唯一可用的将是密钥协议方案,例如短暂的 Diffie-Hellman。现在大多数配置良好的 TLS 1.0-TLS 1.2 服务器只提供临时 Diffie-Hellman。
  • "...我想在 Linux 上用 C 语言编写 SSL 客户端" - 请参阅 OpenSSL wiki 上 TLS Client 的示例代码。

标签: c openssl ssl-certificate handshake


【解决方案1】:

不幸的是,这是不可能的。作为 SSL(或 TLS)协议的一部分,服务器将始终发送其证书。

如果您想绕过 ISP 审查,我建议您使用 VPN 或 Tor。

【讨论】:

  • 除非双方都支持并同意“匿名”或 PSK 或 SRP 密钥交换之一——但没有公共服务器这样做;您必须运行自己的服务器,如果这样做,您可以更轻松(并且不太明显)使用您选择的无害名称的普通基于证书的密钥交换。
  • @dave_thompson_085 客户端可以假装它收到证书(使用预存证书)并完成握手吗?
  • @judian:不太可能。如果 ISP 或其他中间人从 TCP 中拼接出证书消息,但留下了所有其他内容,包括调整后的序列号,原则上您可以逐位伪造证书消息(不仅仅是单个证书)完美握手可以继续。请注意,它必须只是证书消息而不是完整航班;你仍然需要 serverhello 并且经常需要 serverkx。但实际上,MitM 将完全阻止连接,除非您让服务器根本不发送证书,而且这只发生在您运行的服务器(或有朋友运行)的情况下。 并且你禁用了 SNI。
  • 作为 SSL(或 TLS)协议的一部分,服务器将始终发送其证书。” - 当使用匿名协议时,例如 Anonymous Diffie-Hellman (ADH),服务器确实发送其证书。不幸的是,它们仍然是标准的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 2016-05-22
  • 2015-10-20
  • 2016-01-18
  • 2018-05-15
相关资源
最近更新 更多