Openssl запрос об использовании - PullRequest
1 голос
/ 12 февраля 2012

Я пытаюсь использовать OpenSSL в своем приложении и установить безопасное соединение.

Сначала я попробовал:

  1. создать структуру ssl
  2. создать socketbio для tcp socket
  3. создать sslbio
  4. установить socketbio на SSL strcut
  5. SSL_accept(ssl)
  6. BIO_push(ssl, socketbio)

Это вызывает успешное рукопожатие, но данные приложения не были должным образом расшифрованы.

Затем я немного подправил и соотнес 6 с

(new) BIO_ctrl(sslbio, SET_SSL, ssl)

и все работало нормально.

Я хотел бы знать, что не так с предыдущим подходом, и что вызывает новую работу apprach?

1 Ответ

1 голос
/ 14 февраля 2012

Трудно ответить на вопрос, не зная, почему вы думаете, 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)

Этот макрос устанавливает элемент ssl объекта BIO, как вы можете видеть в 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, а то, где он устанавливает указатель ssl в объекте BIO_SSL на ваш активный контекст SSL, т. Е. ((BIO_SSL *)b->ptr)->ssl=ssl;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...