【发布时间】:2016-02-29 11:54:45
【问题描述】:
我开发了向服务器发送消息的 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 Socket 向 SSL 服务器发送消息并接收来自服务器的响应。但是在我们的 IOCP 客户端应用程序中,我们使用 WSASend 和 WSARecv 进行数据交换。 如何使用 SSL_write/SSL_read 函数在 SSL 服务器上执行此操作?
请指导我这样做。
编辑日期:2016 年 3 月 1 日
我尝试在“err = SSL_connect(ssl);”之后为 SSL 套接字使用 BIO 对作为
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 支持。
【问题讨论】:
标签: windows ssl openssl winsock2 iocp