使用OpenSSL发送数据

时间:2018-10-08 08:11:50

标签: c openssl

为了进行测试,我想创建2个SSL *实例,并让它们彼此发送数据。

握手完成后,我可以毫无问题地将数据从客户端发送到服务器。 从服务器向客户端发送数据失败,并显示以下错误:“错误:1408F119:SSL例程:ssl3_get_record:解密失败或错误记录mac”

在两种情况下,以下代码均用于发送数据,SSL *实例基于内存BIO,已删除错误检查以提高可读性。

SSL* source;
SSL* destination;
BIO *r_bio;
BIO *w_bio;
int sRc;

//....    

r_bio = SSL_get_rbio(destination);
w_bio = SSL_get_wbio(source);

//Encrypt message 

printf("Buffer before encryption: %d Bytes -> 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x...\n", _g_buffer_lenght, _g_buffer[0], _g_buffer[1], _g_buffer[2], _g_buffer[3], _g_buffer[4]);

ERR_clear_error();
sRc = SSL_write(source, _g_buffer, _g_buffer_lenght);
if (sRc <= 0) {
    _log_openssl_error_queue();
    return -1;
}

_g_buffer_lenght = BIO_ctrl_pending(w_bio);
BIO_read(w_bio, _g_buffer, _g_buffer_lenght);

printf("Buffer after encryption: %d Bytes -> 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x...\n", _g_buffer_lenght, _g_buffer[0], _g_buffer[1], _g_buffer[2], _g_buffer[3], _g_buffer[4]);

//Decrypt message 

BIO_flush(r_bio);
BIO_write(r_bio, _g_buffer, _g_buffer_lenght);
ERR_clear_error();
sRc = SSL_read(destination, _g_buffer, _g_buffer_lenght);
if (sRc <= 0) {
    _log_openssl_error_queue();
    return -1;
}

_g_buffer_lenght = sRc;
printf("Buffer after decryption: %d Bytes -> 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x...\n", _g_buffer_lenght, _g_buffer[0], _g_buffer[1], _g_buffer[2],    _g_buffer[3], _g_buffer[4]);

加密后产生的记录看起来正确(正确的类型,版本和长度)。

从服务器向客户端发送数据时,是否还需要执行一些额外的步骤,我希望握手完成后两个对等端相等吗?

1 个答案:

答案 0 :(得分:0)

我能够解决问题。

我的测试代码允许实例交换数据,直到两个实例都为 SSL_is_init_finished 返回1,问题是客户端实例在发送TLS_FINISHED之后返回1,但仍然需要服务器TLS_FINISHED消息能够交流。