我正在尝试编写一个可以与基于Java的服务器安全通信的C ++应用程序。我在C ++中使用OpenSSL来使用Java建立SSL上下文。 C ++中的上下文建立失败,错误为“意外消息”。这在握手期间发生。 OpenSSL似乎不理解从Java服务器收到的消息。看看OpenSSL代码,它似乎正在获取“应用程序数据”类型的数据,这在握手期间是不期望的。即使启用了OpenSSL提供的所有解决方法选项,也会发生此问题。
我在这个论坛上看到多个用户发布了类似的问题,我尝试了这里建议的解决方案。但他们似乎都没有帮助我。有没有人知道这里会出现什么问题?
请注意,Java客户端能够与Java服务器建立SSL上下文,它只是无法建立上下文的C ++客户端。
由于 Subrahmanya
以下是我的代码。 我提到的其中一个帖子是 TLSv1 handshake failure
以下是我的代码的样子
SSL_CTX * ssl_ctx;
SSL_METHOD * meth;
SSL * ssl;
............. more declarations
meth = TLSv1_client_method ();
ssl_ctx = SSL_CTX_new (meth);
// Enable different workarounds in OpenSSL, which (as per OpenSSL spec) are harmless
ctx_options = SSL_OP_ALL;
ctx_options &= ~SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG;
SSL_CTX_set_options(ssl_ctx, ctx_options);
ssl = SSL_new (ssl_ctx);
if (ssl == NULL) {
return false;
}
SSL_set_fd (ssl, connection_get_socket (connection));
tls_set_common_data (connection, ssl, ssl_ctx);
SSL_set_verify(ssl, SSL_VERIFY_PEER, NULL);
while (1) {
int retCode = SSL_connect (ssl);
if (retCode == 1)
break;
/* get ssl error */
ssl_error = SSL_get_error (ssl, -1);
switch (ssl_error) {
case SSL_ERROR_WANT_READ:
break;
case SSL_ERROR_WANT_WRITE:
break;
case SSL_ERROR_SYSCALL:
log (LEVEL_CRITICAL, "syscall error while doing TLS handshake, ssl error (code:%d)",
ssl_error);
errdetail = ERR_get_error();
ERR_error_string_n(errdetail, error_buffer, sizeof(error_buffer));
log(LEVEL_CRITICAL, "Error during SSL_Connect: %s", error_buffer);
return false;
default:
return false;
}
}