首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >客户哈罗后握手失败

客户哈罗后握手失败
EN

Stack Overflow用户
提问于 2016-07-16 12:52:13
回答 2查看 3.2K关注 0票数 0

我开发了一个由C++和OpenSSL开发的应用程序来监控MySQL数据包。我的应用程序充当代理。在没有SSL连接的情况下,一切正常,但是当我使用SSL连接时,它会在接收到客户端Hello之后面临“握手失败”。

我使用openssl开发了一个ssl服务器,并将其阻塞并在合适的时间等待接受ssl连接。

Wireshark截图

Openssl输出:

140167999850080:错误:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no共享cipher:s3_srvr.c:1352: 140167999850080:错误:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no共享cipher:s3_srvr.c:1352:

编辑:--这是当检测到ssl选项时与客户端交互的代码的一部分。接收到登录请求包后,此代码将运行。

代码语言:javascript
复制
void mysqlNegotiation(X509* cert, EVP_PKEY* key, int fd) {
    SSL_library_init();
    SSL_load_error_strings();
    OpenSSL_add_all_algorithms();

    SSL_CTX* context = SSL_CTX_new(TLSv1_server_method());

    SSL_CTX_use_certificate(context, cert);
    SSL_CTX_use_PrivateKey(context, key);
    SSL_CTX_check_private_key(context);

    SSL_CTX_set_ecdh_auto(context, 1);
    SSL_CTX_set_verify(context, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0);
    SSL_CTX_set_verify_depth(context, 4);
    SSL_CTX_load_verify_locations(context, "ca-cert.pem", "/etc/mysql/");

    SSL* ssl = SSL_new(context);
    SSL_set_fd(ssl, fd);

    int r = SSL_accept(ssl);
    if (r != 1) {
        ERR_print_errors_fp(stderr);
        int err_SSL_get_error = SSL_get_error(ssl, r);

        switch (err_SSL_get_error) {
            case SSL_ERROR_NONE:
                printf("%d", 0);
                break;
            case SSL_ERROR_SSL:
                printf("%d", 1);
                break;
            case SSL_ERROR_WANT_READ:
                printf("%d", 2);
                break;
            case SSL_ERROR_WANT_WRITE:
                printf("%d", 3);
                break;
            default:
                printf("%d", -1);
                break;
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-16 13:03:27

此错误可能有几个原因,这表明,正如所述,客户端和服务器没有实现可以协商的通用密码。其中一些原因是:

  1. TLS协议级别不匹配。例如,您可能使用了SSLv23_method通过SSL_CTX_set_options()设置SSL_OP_ALL|SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3|SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1,表示只支持TLS1.2或更高版本,但客户端不支持任何高于TL1.1的内容。这只是一个例子,协议不匹配也可以在许多其他方面发生。
  2. 通过SSL_CTX_set_cipher_list()配置的SSL密码列表不包括对等方支持的任何密码。
  3. SSL上下文没有使用DH参数初始化,因此不支持前向保密,对等方只支持支持前向保密的密码。

还有其他原因。如果不检查客户端和服务器的配置,就不可能提供权威的答案。因为只有您可以访问客户端和服务器的代码,所以应该由您自己来解决。这里唯一的真正答案是:找到另一个与您的客户端一起工作的服务器代码,然后查看它的代码,找出它与您的代码不同的地方。

票数 1
EN

Stack Overflow用户

发布于 2016-07-16 13:35:00

一个常见的错误是,中间应用程序中的人没有设置任何证书,这意味着不能使用需要身份验证的密码,即客户提供的所有密码。这将导致“无共享密码”警报作为对ClientHello的响应。当然,这只是猜测,因为您在中间代理的人的代码是未知的。

如果这种推测是错误的,我建议您提供更多的信息,即创建一个最小、完整和可验证的示例,以便其他人能够实际看到您设置的细节,甚至可能重现您的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38411412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档