我开发了一个由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选项时与客户端交互的代码的一部分。接收到登录请求包后,此代码将运行。
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;
}
}
}发布于 2016-07-16 13:03:27
此错误可能有几个原因,这表明,正如所述,客户端和服务器没有实现可以协商的通用密码。其中一些原因是:
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的内容。这只是一个例子,协议不匹配也可以在许多其他方面发生。SSL_CTX_set_cipher_list()配置的SSL密码列表不包括对等方支持的任何密码。还有其他原因。如果不检查客户端和服务器的配置,就不可能提供权威的答案。因为只有您可以访问客户端和服务器的代码,所以应该由您自己来解决。这里唯一的真正答案是:找到另一个与您的客户端一起工作的服务器代码,然后查看它的代码,找出它与您的代码不同的地方。
发布于 2016-07-16 13:35:00
一个常见的错误是,中间应用程序中的人没有设置任何证书,这意味着不能使用需要身份验证的密码,即客户提供的所有密码。这将导致“无共享密码”警报作为对ClientHello的响应。当然,这只是猜测,因为您在中间代理的人的代码是未知的。
如果这种推测是错误的,我建议您提供更多的信息,即创建一个最小、完整和可验证的示例,以便其他人能够实际看到您设置的细节,甚至可能重现您的问题。
https://stackoverflow.com/questions/38411412
复制相似问题