2012-02-12 4 views
1

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

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

  1. создать SSL-структуру
  2. создать socketbio для сокета TCP
  3. создать sslbio
  4. набор socketbio для SSL strcut
  5. SSL_accept(ssl)
  6. BIO_push(ssl, socketbio)

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

Тогда я подправил немного, и relaced 6 с

(new) BIO_ctrl(sslbio, SET_SSL, ssl) 

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

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

ответ

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) 

Этот макрос устанавливает элемент 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;.

+0

thnx мат для объяснения. Да, ididn't использовать ctrl direct; y, но set_ssl, как вы упомянули выше. – Varun

Смежные вопросы