无法使OpenSSL与基于Java的服务器一起工作

时间:2013-09-11 04:37:27

标签: c++ openssl

我正在尝试编写一个可以与基于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;
    }
}

0 个答案:

没有答案