C 关于用法的Openssl查询

C 关于用法的Openssl查询,c,openssl,C,Openssl,我正在尝试在我的应用程序中使用OpenSSL,并实现安全连接 起初我试着: 创建ssl结构 为tcp套接字创建socketbio 创建sslbio 将socketbio设置为SSL struct SSL\u接受(SSL) BIO\u推送(ssl、socketbio) 这会导致握手成功,但应用程序数据未正确解密 然后我稍微调整了一下,然后用6秒的速度放松 (new) BIO_ctrl(sslbio, SET_SSL, ssl) 事情进展顺利 我想知道,以前的方法有什么问题,是什么导致了新方法的工

我正在尝试在我的应用程序中使用OpenSSL,并实现安全连接

起初我试着:

  • 创建ssl结构
  • 为tcp套接字创建socketbio
  • 创建sslbio
  • 将socketbio设置为SSL struct
  • SSL\u接受(SSL)
  • BIO\u推送(ssl、socketbio)
  • 这会导致握手成功,但应用程序数据未正确解密

    然后我稍微调整了一下,然后用6秒的速度放松

    (new) BIO_ctrl(sslbio, SET_SSL, ssl)
    
    事情进展顺利


    我想知道,以前的方法有什么问题,是什么导致了新方法的工作?

    如果不知道为什么你认为
    BIO\u push
    就是你需要做的一切,那么很难回答这个问题。无论如何,你不应该直接调用
    BIO\u ctrl
    。您应该使用
    BIO.h
    中定义的高级包装
    BIO\u set\u ssl

    #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

    如果不知道你为什么认为BIO_push就是你所需要做的一切,就很难回答这个问题。无论如何,你不应该直接调用
    BIO\u ctrl
    。您应该使用
    BIO.h
    中定义的高级包装
    BIO\u set\u ssl

    #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

    请配合进行解释。是的,我不使用ctrl-direct;y,但请按照上面提到的设置_ssl.thnx mate进行解释。是的,我不使用ctrl-direct;y,但按照上面提到的设置_ssl。