Ich entwickelte eine App von C++ und OpenSSL, um MySQL-Pakete zu überwachen. Meine App fungiert als Proxy. In keiner SSL-Verbindung ist alles in Ordnung, aber wenn ich eine SSL-Verbindung benutze, wird es mit "Handshake-Fehler" genau nach dem Empfang von Client Hello konfrontiert.Handshake Fehler nach Client Hallo
Ich entwickelte einen ssl-Server mit openssl und machen es blockieren und warten zur richtigen Zeit für die Annahme SSL-Verbindung.
Wireshark Screenshot
140167999850080:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1352:
140167999850080:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1352:
Edited: Dies ist ein Teil des Codes, der mit dem Kunden interagieren, wenn es ssl Verbindungsoption On ist erkennen. Nach dem Erhalt des Anmeldeanforderungspakets wird dieser Code ausgeführt.
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;
}
}
}
Ich bezweifle, dass dieser Code korrekt ist: 'SSL_CTX * Kontext = = SSL_CTX_new (TLSv1_server_method()); '. Es kompiliert wahrscheinlich nicht einmal. Bitte machen Sie ein tatsächlich funktionierendes Beispiel, mit dem das Problem reproduziert werden kann. –
Haben Sie sich angesehen, welche Verschlüsselungen der Kunde anbietet? Vielleicht eine Paketerfassung machen?Wenn der Client beispielsweise nur DH-Verschlüsselungen anbietet, wird dies fehlschlagen, weil Sie keinen DH-Parameter (nicht ECDH) festlegen. –
Quellcode geändert! Ja, beide bieten dieselbe Verschlüsselungsliste – mitrc