gpt4 book ai didi

windows - 在 IOCP 客户端应用程序中添加 OpenSSL 支持

转载 作者:太空宇宙 更新时间:2023-11-03 14:49:34 27 4
gpt4 key购买 nike

我开发了向服务器发送消息的 IOCP 客户端应用程序。现在我想在其中添加 SSL 支持,以便使用 OpenSSL 连接支持 SSL 的服务器应用程序。

我已经使用

初始化了 SSL
/* Load encryption & hashing algorithms for the SSL program */
SSL_library_init();

/* Load the error strings for SSL & CRYPTO APIs */
SSL_load_error_strings();

/* Create an SSL_METHOD structure (choose an SSL/TLS protocol version) */
meth = TLSv1_2_method();

/* Create an SSL_CTX structure */
ctx = SSL_CTX_new(meth);

if(ctx == NULL)
return false;

SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, nullptr);

SSL_CTX_set_verify_depth(ctx,1);

初始化后我们创建正常的 IOCP 工作线程,然后 IOCP 套接字连接到 SSL 服务器套接字

            /* An SSL structure is created */
ssl = SSL_new (ctx);

RETURN_NULL(ssl);

/* Assign the socket into the SSL structure (SSL and socket without BIO) */
SSL_set_fd(ssl, Socket);

/* Perform SSL Handshake on the SSL client */
int err;
err = SSL_connect(ssl);
if (err<1)
{
err=SSL_get_error(ssl,err);
printf("SSL error #%d in accept,program terminated\n",err);
}

RETURN_SSL(err);

/* Informational output (optional) */
printf ("SSL connection using %s\n", SSL_get_cipher (ssl));

/* Get the server's certificate (optional) */
X509 *server_cert;
server_cert = SSL_get_peer_certificate (ssl);

if (server_cert != NULL)
{
printf ("Server certificate:\n");

char *str;
str = X509_NAME_oneline(X509_get_subject_name(server_cert),0,0);
//RETURN_NULL(str);
printf ("\t subject: %s\n", str);
free (str);

str = X509_NAME_oneline(X509_get_issuer_name(server_cert),0,0);
//RETURN_NULL(str);
printf ("\t issuer: %s\n", str);
free(str);

X509_free (server_cert);

}
else
printf("The SSL server does not have certificate.\n");

到此为止的服务器 SSL 连接正常工作,我能够正确检索服务器证书详细信息。现在我想通过 SSL 套接字向 SSL 服务器发送消息并接收来自服务器的响应。但是在我们的 IOCP 客户端应用程序中,我们使用 WSASend 和 WSARecv 进行数据交换。我如何使用 SSL_write/SSL_read 函数在 SSL 服务器上执行此操作?

请指导我这样做。


编辑于:2016 年 3 月 1 日

我尝试在“err = SSL_connect(ssl);”之后将 BIO 对用于 SSL 套接字。作为

bioIn = BIO_new_socket(this->Socket, BIO_NOCLOSE);
bioOut = BIO_new_socket(this->Socket, BIO_NOCLOSE);
SSL_set_bio(ssl, bioIn, bioIn);

然后尝试将消息长度发送到服务器

int err = SSL_write(ssl, PerIOHandle->Buffer, PerIOHandle->BufferLength);

一旦上述语句执行,服务器读取适当的消息长度并等待来自客户端的实际消息。但是当我尝试使用上述相同的语句发送消息时,服务器 SSL_read 函数失败并返回 -1 代码。

请任何人帮助我添加完整的 SSL 支持。

最佳答案

正如您所发现的,您需要使用 OpenSSL IO 抽象,即 BIO。这使您可以将 OpenSSL 代码与套接字分开。您只需通过 BIO 推送数据,然后获取它们提供给您的数据并向异步/IOCP 套接字发出您自己的写入。

我在 2002 年为 Dr. Dobbs Journal 写过这篇文章,请参阅 here .本文重点介绍将 OpenSSL 与 MFC 的异步套接字结合使用,但如果您想将其与 IOCP 代码结合使用,其思路是相同的。

本文附带完整且有效的代码,您可以将其用作 IOCP 代码的基础。您在一开始就连接 BIO 对,根本不使用 SSL_connect()。

关于windows - 在 IOCP 客户端应用程序中添加 OpenSSL 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35698891/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com