关于用法的Openssl查询

时间:2012-02-12 17:05:52

标签: c openssl

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

起初我试过了:

  1. 创建ssl struct
  2. 为tcp套接字创建socketbio
  3. 创建一个sslbio
  4. 将socketbio设置为SSL strcut
  5. SSL_accept(ssl)
  6. BIO_push(ssl, socketbio)
  7. 这会导致握手成功发生,但应用程序数据未正确解密。

    然后我稍微调整了一下,并用

    重新加了6
    (new) BIO_ctrl(sslbio, SET_SSL, ssl)
    
    事情很顺利。

    我想知道,之前的方法有什么问题,以及导致新apprach工作的原因是什么?

1 个答案:

答案 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>