客户端如何使用预先存储的服务器证书进行SSL握手?

问题描述:

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

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

我正在学习如何使用OpenSSL,我只需要这里的do-handshake部分。

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

+0

为什么?如何告诉服务器不要发送证书?你如何处理更改的证书?听起来对我来说是一个坏主意,这可能是一个[XY问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? –

+0

为了做到这一点,您需要访问客户端和服务器代码,并且一旦实现,此握手只能在客户端和服务器之间进行,即服务器无法与任何其他客户端进行通信。 – mnistic

+0

“*客户端如何使用预先存储的服务器证书进行SSL握手?*”只需使用它,忽略服务器发送给客户端的内容? – alk

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

如果你想绕过ISP审查,我推荐使用VPN或Tor。

+1

除非双方支持并同意其中一个“匿名”或PSK或SRP密钥交换 - 但没有公共服务器会这样做;你必须运行你自己的服务器,如果你这样做,你可以更容易地(并且不那么明显)使用普通的基于证书的keyexchange和你选择的无害的名字。 –

+0

@ dave_thompson_085客户是否可以假装接收证书(使用预先存储的证书)并完成握手? – judian

+0

@judian:不太可能。如果ISP或其他MitM将证书消息从TCP中剪接出来,但将其他所有内容(包括调整后的序列号)都留下,并且您可以将证书消息(而不仅仅是单个证书)完美伪造,原则上握手可以继续。请注意,它只能是证书信息而不是全部航班;你仍然需要serverhello,通常serverkx。但事实上,MitM将完全阻止连接,除非你让服务器根本不发送证书,而且只有在你运行的服务器(或者有朋友运行)时才会发生。 _并且你禁用SNI。 –