【发布时间】:2019-06-08 15:52:07
【问题描述】:
我正在尝试使用 OpenSSL 实现一个简单的 SSL 客户端,但我只想读取带有 BIO_gets() 的一行。我在这里得到了一个基于客户端示例的工作测试程序:
https://linux.die.net/man/3/bio_new_ssl_connect。
但在这段代码中,使用了函数BIO.read()。我只是用 BIO_gets 替换 BIO.read 来尝试它,但在这种情况下返回 -2 并且根据文档,此操作未在特定 BIO 类型中实现。我知道示例中的 BIO 是 SSL BIO,而在服务器示例(使用 BIO_gets)中,缓冲 BIO 位于 SSL BIO 之上:
bbio = BIO_new(BIO_f_buffer());
sbio = BIO_push(bbio, sbio);
我尝试将以上两行代码放入我的客户端代码中,但随后程序冻结。所以我的问题是:如何在客户端程序中使用 BIO_gets 一次读取一行?
完整代码:
SSL_load_error_strings();
ERR_load_BIO_strings();
SSL_library_init();
context = SSL_CTX_new(SSLv23_client_method());
if(SSL_CTX_set_default_verify_paths(context) == 0){
fprintf(stderr, "Error: Error: Can't load default verify paths!\n");
printf("Reason: %s\n", ERR_reason_error_string(ERR_get_error()));
return -1;
}
bio = BIO_new_ssl_connect(context);
BIO_get_ssl(bio, &ssl);
if(!ssl){
fprintf(stderr, "Error: Can't locate SSL pointer\n");
return -1;
}
//Don't want any retries
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
BIO_set_conn_hostname(bio, connection);
if(BIO_do_connect(bio) <= 0){
fprintf(stderr, "Error: Error: Can't load default verify paths!\n");
ERR_print_errors_fp(stderr);
return -1;
}
if(SSL_get_verify_result(ssl) != X509_V_OK)
{
fprintf(stderr, "No valid certificate!\n");
return -1;
}
static char recv_buffer[1024];
// Read line
int len = BIO_gets(bio, recv_buffer, 1024);
printf("Received: %d, %s", len, recv_buffer);
return 0;
【问题讨论】:
-
你能提供你的完整代码吗?
-
我编辑了问题。