我使用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
谢谢。
答案 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_read
和SSL_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