2012-02-12 59 views
1

我想在我的應用程序中使用OpenSSL,並實現安全連接。關於用法的Openssl查詢

起初我想:

  1. 創建SSL結構
  2. 爲TCP套接字
  3. 創建sslbio
  4. 集socketbio到SSL strcut創建socketbio
  5. SSL_accept(ssl)
  6. BIO_push(ssl, socketbio)

這會導致握手成功發生,但應用程序數據未正確解密。

然後我調整了一下,並與

(new) BIO_ctrl(sslbio, SET_SSL, ssl) 

relaced 6和事情的罰款。

我想知道,以前的方法有什麼問題,以及什麼導致新的評估工作?

回答

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;

+0

thnx隊友解釋。是的,ididn't不使用ctrl direct; y而是使用set_ssl,如上所述。 – Varun 2012-03-02 06:22:09