1

我有一个 tcp 服务器,它检测传入的 SSL 连接(请参阅此处),然后执行以下操作:

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 对象,文档真的很混乱。任何帮助表示赞赏。谢谢!

4

1 回答 1

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);
于 2012-07-25T16:49:38.690 回答