openssl查询使用情况

发布于 2025-01-05 00:09:08 字数 470 浏览 0 评论 0原文

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

起初我尝试:

  1. create ssl struct
  2. create socketbio for the tcp socket
  3. create a sslbio
  4. set socketbio to SSL strcut
  5. SSL_accept(ssl)
  6. BIO_push(ssl, socketbio)

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

然后我稍微调整了一下,将 6 替换为 6

(new) BIO_ctrl(sslbio, SET_SSL, ssl)

,一切正常。

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

I am trying to use OpenSSL in my application, and achieve a secure connection.

At first I tried:

  1. create ssl struct
  2. create socketbio for the tcp socket
  3. create a sslbio
  4. set socketbio to SSL strcut
  5. SSL_accept(ssl)
  6. BIO_push(ssl, socketbio)

This cause handshake to happen successfully, but application data wasn't properly decrypted.

Then I tweaked a little, and relaced 6 with

(new) BIO_ctrl(sslbio, SET_SSL, ssl)

and things worked fine.

I Wanted to know, what's wrong with previous approach, and what's causing the new apprach work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

高跟鞋的旋律 2025-01-12 00:09:08

如果不知道为什么您认为 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 上下文,即 ((BI​​O_SSL *)b->ptr)->ssl=ssl;

It's hard to answer the question without knowing why you think BIO_push is all you need to do. At any rate, you shouldn't call BIO_ctrl directly. You should use the high-level wrapper BIO_set_ssl defined in bio.h:

#define BIO_set_ssl(b,ssl,c)    BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)ssl)

This macro sets the ssl member of the BIO object as you can see in 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;

The important step in this function is not the BIO_push, but rather is where it sets the ssl pointer in the BIO_SSL object to your active SSL context, i.e., ((BIO_SSL *)b->ptr)->ssl=ssl;.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文