2012-07-15 52 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);