我使用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_read
和SSL_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