OpenSSL:从客户端发起重新协商

时间:2018-10-10 06:28:27

标签: ssl openssl

我使用mem-BIO建立了客户端-服务器连接。我能够在没有套接字IO的情况下发送数据。这是我的参考资料-http://roxlu.com/2014/042/using-openssl-with-memory-bios

问题1: 对于解密,它使用BIO_write(),然后使用SSL_read()。如果通过套接字IO记录超过2个数据包,我需要注意什么?如果SSL_read()返回SSL_ERROR_WANT_READ,是否表示数据已缓存在in_bio中,并且我需要再次调用BIO_write()和SSL_read()作为第二个数据包,而这次SSL_read()将返回SSL_ERROR_NONE?

问题2: 我正在尝试了解SSL重新协商握手。它是否再次经过4次握手?还是只是进行2次握手而可能不再需要客户端问候?请分享有关重新协商握手交换的任何信息。

现在,我已将此代码添加到以上参考示例中:

main() {
<snip - Initial handshake>
</snip>

  SSL_renegotiate(client.ssl);
  SSL_do_handshake(client.ssl);
  krx_ssl_handle_traffic(&client, &server);
  krx_ssl_handle_traffic(&server, &client);
  krx_ssl_handle_traffic(&client, &server);
  krx_ssl_handle_traffic(&server, &client);
}

我通过回调看到了这些

+ client:      HANDSHAKE START -  before connect initialization  - CINIT
+ client:                 LOOP -        SSL renegotiate ciphers  - UNKWN
+ client:                 LOOP -     SSLv3 write client hello A  - 3WCH_A
+ server:      HANDSHAKE START -   before accept initialization  - AINIT
+ server:                 LOOP -   before accept initialization  - AINIT
+ server:                 LOOP -      SSLv3 read client hello A  - 3RCH_A
+ server:                 LOOP -     SSLv3 write server hello A  - 3WSH_A
+ server:                 LOOP -      SSLv3 write certificate A  - 3WSC_A
+ server:                 LOOP - SSLv3 write certificate reques  - 3WCR_A
+ server:                 LOOP -      SSLv3 write server done A  - 3WSD_A
+ server:                 LOOP -               SSLv3 flush data  - 3FLUSH
+ client:                 LOOP -      SSLv3 read server hello A  - 3RSH_A
+ client:                 LOOP - SSLv3 read server certificate   - 3RSC_A
+ client:                 LOOP - SSLv3 read server certificate   - 3RCR_A
+ client:                 LOOP -       SSLv3 read server done A  - 3RSD_A
+ client:                 LOOP - SSLv3 write client certificate  - 3WCC_A
+ client:                 LOOP - SSLv3 write client key exchang  - 3WCKEA
+ client:                 LOOP - SSLv3 write certificate verify  - 3WCV_A
+ client:                 LOOP - SSLv3 write change cipher spec  - 3WCCSA
+ client:                 LOOP -         SSLv3 write finished A  - 3WFINA
+ client:                 LOOP -               SSLv3 flush data  - 3FLUSH
+ server:                 LOOP - SSLv3 read client certificate   - 3RCC_A
+ server:                 LOOP - SSLv3 read client key exchange  - 3RCKEA
+ server:                 LOOP - SSLv3 read certificate verify   - 3RCV_A
+ server:                 LOOP -          SSLv3 read finished A  - 3RFINA
+ server:                 LOOP -   SSLv3 write session ticket A  - UNKWN
+ server:                 LOOP - SSLv3 write change cipher spec  - 3WCCSA
+ server:                 LOOP -         SSLv3 write finished A  - 3WFINA
+ server:                 LOOP -               SSLv3 flush data  - 3FLUSH
+ server:       HANDSHAKE DONE - SSL negotiation finished succe  - SSLOK
+ client:                 LOOP - SSLv3 read server session tick  - UNKWN
+ client:                 LOOP -          SSLv3 read finished A  - 3RFINA
+ client:       HANDSHAKE DONE - SSL negotiation finished succe  - SSLOK

谢谢。

1 个答案:

答案 0 :(得分:0)

Q1。数据包和_WANT_READ

您根本不清楚您的数据包是什么。在TCP上使用SSL / TLS(通常情况下)时,SSL / TLS记录最多可以超过16k个八位位组,而在个网络路径上,TCP通常使用的数据包(即段)大小为大约需要1400个。完成一个记录可能需要10个以上的数据包。而且,当该记录出现时,该记录可能不是ApplicationData记录;如果不是,SSL_read仍然没有要返回的数据,它将根据协议进行操作,该协议可能在返回数据之前需要进一步读取AND / OR WRITES。您不应该尝试猜测无阻塞SSL_read(或SSL_write)将要做什么;您应该始终查看它们的返回值以及SSL_get_error中的'extended'值(这是实际返回SSL_WANT_{READ,WRITE}等,而不是SSL_readSSL_write的例程)。手册页对此进行了说明,如果您尚未阅读,我鼓励您阅读。如果您在未使用手册页的非WSL Windows上,请参见the website

Q2。重新协商

(注意:仅针对TLS才能通过1.2进行回答; 1.3肯定会大大改变正常的握手,而且我相信还会重新协商,但我尚未详细介绍。)除了它在会话期间启动(加密)上下文)已经在使用中,并且可以由服务器通过RequestHello启动,并且(很重要)可以使用重新协商指示扩展(RFC5746)来防止“ Apache-splice”攻击(CVE-2009 -3555),重新协商(与初次协商几乎相同)。如果完全握手,则需要进行四次飞行(两次往返);如果使用简短的握手(恢复先前存在的会话),则需要进行3次飞行,但是最后一次可以与客户端数据结合,经常将其减少为一次往返。请参阅我在https://security.stackexchange.com/questions/91248/questions-about-triple-handshakes-considered-harmful-breaking-and-fixing-authen(其相关性显然不明显)的答案,以获取对此的即兴表达。有关握手,请参见RFC 5246 et pred