我正在尝试在我的应用程序中使用OpenSSL,并实现安全连接。
起初我试过了:
SSL_accept(ssl)
BIO_push(ssl, socketbio)
这会导致握手成功发生,但应用程序数据未正确解密。
然后我稍微调整了一下,并用
重新加了6(new) BIO_ctrl(sslbio, SET_SSL, ssl)
事情很顺利。
我想知道,之前的方法有什么问题,以及导致新apprach工作的原因是什么?
答案 0 :(得分:1)
如果不知道为什么你认为BIO_push
就是你需要做的事情,那么很难回答这个问题。无论如何,您不应该直接致电BIO_ctrl
。您应该使用BIO_set_ssl
中定义的高级包装器bio.h
:
#define BIO_set_ssl(b,ssl,c) BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)ssl)
此宏设置BIO对象的ssl成员,如bio_ssl.c
中所示:
case BIO_C_SET_SSL:
if (ssl != NULL)
ssl_free(b);
b->shutdown=(int)num;
ssl=(SSL *)ptr;
((BIO_SSL *)b->ptr)->ssl=ssl;
bio=SSL_get_rbio(ssl);
if (bio != NULL)
{
if (b->next_bio != NULL)
BIO_push(bio,b->next_bio);
b->next_bio=bio;
CRYPTO_add(&bio->references,1,CRYPTO_LOCK_BIO);
}
b->init=1;
break;
此函数中的重要步骤不是BIO_push
,而是将BIO_SSL
对象中的ssl指针设置为活动SSL上下文,即((BIO_SSL *)b->ptr)->ssl=ssl;
。 / p>