我使用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


谢谢。

最佳答案

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中的“扩展”值(这是实际返回SSL_WANT_{READ,WRITE}等的例程,而不是返回SSL_readSSL_write的例程)。手册页对此进行了说明,如果您尚未阅读,我鼓励您阅读。如果您在不使用手册页的非WSL Windows上,请参见the website

Q2。重新谈判

(注意:仅通过1.2为TLS回答; 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

10-07 23:53