2012-07-15 55 views
0

我有檢測到輸入的SSL連接(見here),然後再執行TCP服務器執行以下操作:如何初始化OpenSSL BIO對象?

BIO* initialize(SSL_CTX *context, int socket){ 
    BIO *bio = NULL; 
    SSL *ssl = SSL_new(context); 
    SSL_set_fd(ssl, socket); 
    if (SSL_accept(ssl) == -1){ 
     return NULL; //error 
    } 
    //what do I do here?? 
    bio = BIO_new_ssl(context, 1); //this seems wrong... 
    return bio; 
} 

我不知道如何創建BIO對象和文檔非常混亂。任何幫助表示讚賞。謝謝!

+1

我向別人挑戰,發現文檔比OpenSSL更容易混淆。 – 2012-07-15 22:22:58

+1

@AdamRosenfield有人曾經告訴我說文檔就像性一樣:當它好時,它很棒;但是當它壞時,它總比沒有好。我告訴他們去閱讀OpenSSL文檔... – chacham15 2012-07-20 02:29:49

+0

哦,來吧。使用OpenSSL實現異步網絡I/O需要幾個小時,即使您之前從未使用它。雖然我根本不會使用BIO :) – 2012-07-25 16:51:20

回答

1

這是我的一個老學生項目(大約在2006年)的摘錄。我希望能夠對這個問題提供一些啓示。 我不使用BIO_new_ssl(),而使用SSL_set_bio()。

SSL_CTX *ctx = setup_server_ctx("root.pem", NULL); 
SSL_CTX *ssl = SSL_new(ctx); 
if (NULL == ssl) { 
    fprintf(stderr, "Error creating SSL context.\n") 
    goto err; 
} 
BIO *acc = BIO_new_accept(port); 

if (BIO_do_accept(acc) <= 0) { 
    fprintf(stderr, "Error accepting connection.\n"); 
    goto err; 
} 

BIO *client = BIO_pop(acc); 
SSL_set_bio(ssl, client, client); 

if (0 >= SSL_accept(ssl)) { 
    fprintf(stderr, "Error accepting SSL connection\n"); 
    goto end; 
} 

SSL_write(ssl, SOME_MESSAGE, strlen(SOME_MESSAGE)); 
char buf[BUF_SIZE + 1]= {0}; 
int ret = SSL_read(ssl, buf, BUF_SIZE); 
if (ret <= 0) { 
    break; 
} 

/* do some more stuff */ 

SSL_get_shutdown(ssl);