2012-07-15 7 views
0

나는 다음 (here 참조) 들어오는 SSL 연결을 인식하여 수행하는 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보다 혼란스러운 문서를 찾는 사람을 찾습니다. –

+1

@AdamRosenfield 누군가는 문서가 섹스와 같다는 말을 들었습니다. 그러나 그것의 나쁠 때, 그것은 아무것도보다는 잘 아직도. 나는 그들에게 OpenSSL 문서를 읽으라고 말했다. – chacham15

+0

오, 어서. OpenSSL을 사용하여 비동기 네트워크 I/O를 구현하는 데는 몇 시간이 걸립니다. 나는 BIO를 전혀 사용하지 않겠지 만 :) –

답변

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); 
관련 문제