【问题标题】:Openssl query about usageOpenssl 使用情况查询
【发布时间】:2012-02-12 17:05:52
【问题描述】:

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

一开始我试过:

  1. 创建 ssl 结构
  2. 为 tcp 套接字创建 socketbio
  3. 创建一个 sslbio
  4. 将 socketbio 设置为 SSL strcut
  5. SSL_accept(ssl)
  6. BIO_push(ssl, socketbio)

这会导致握手成功,但应用程序数据未正确解密。

然后我稍作调整,将 6 替换为

(new) BIO_ctrl(sslbio, SET_SSL, ssl)

一切都很好。

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

【问题讨论】:

    标签: c openssl


    【解决方案1】:

    如果不知道为什么您认为BIO_push 就是您需要做的一切,很难回答这个问题。无论如何,您不应该直接致电BIO_ctrl。您应该使用在bio.h 中定义的高级包装器BIO_set_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;y 而是 set_ssl 就像你上面提到的那样。
    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    相关资源
    最近更新 更多