"keine gemeinsame cipher" bei ssl_accept, warum?
Habe gegoogelt viel, nicht gefunden keine Antwort auf Folgendes problem:
Erstellt server-code und client-code, bekomme aber
Fehler:1408A0C1:SSL-Routinen:SSL3_GET_CLIENT_HELLO:keine gemeinsame cipher
auf dem server, wenn dabei SSL_connect
.
Den code unten verengt, um die Reihenfolge der SSL - /socket-bezogene Funktion nur aufruft. Error-handling-code angewendet wurde, wo zutreffend, um sicherzustellen, dass Anrufe vor SSL_accept
/SSL_connect
zurück keine Fehler codes. Ich habe auch Links Initialisierung Methoden.
Ich weiß nicht, ob es eine Rolle spielt, aber mir laufen server und client auf localhost.
Gibt es möglicherweise offensichtliche Fehler, aber ich bin ganz neu mit OpenSSL.
Client-code (inparams: hostname
, certificate_chain_file
, ca_certificate_file
):
SSL_library_init(); //<<< To clarify my initialization
OpenSSL_add_all_algorithms(); //<<< To clarify my initialization
SSL_load_error_strings(); //<<< To clarify my initialization
ERR_load_crypto_strings(); //<<< To clarify my initialization (2)
OpenSSL_add_all_ciphers(); //<<< To clarify my initialization (2)
SSL_METHOD const * method = SSLv23_method(); //<<< Updated method
SSL_CTX * ctx = SSL_CTX_new(method);
SSL_CTX_use_certificate_chain_file(ctx, certificate_chain_file));
const long flags = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION; //<<< Added
SSL_CTX_set_options(ctx, flags); //<<< Added
SSL_CTX_load_verify_locations(ctx, ca_certificate_file, NULL));
struct hostent * host = gethostbyname(hostname);
int client_sd = socket(PF_INET, SOCK_STREAM, 0);
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(6789);
server.sin_addr.s_addr = *(long *) (host->h_addr);
connect(client_sd, (struct sockaddr *) &server, sizeof(server));
SSL * ssl = SSL_new(ctx);
SSL_set_fd(ssl, client_sd);
const char * const preferred_ciphers = "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4";
SSL_set_cipher_list(ssl, preferred_ciphers); //<<< Added
SSL_set_tlsext_host_name(ssl, hostname); //<<< Added
mydata_t mydata;
mydata_index_client = SSL_get_ex_new_index(0, (void *) "mydata index", NULL, NULL, NULL);
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, verify_callback_client);
SSL_CTX_set_verify_depth(ctx, 1);
mydata.verify_depth = 0;
SSL_set_ex_data(ssl, mydata_index_client, &mydata);
int connection_result = SSL_connect(ssl);
if (connection_result < 0)
{
//Comes in here and ERR_get_error indicates
//error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
}
else if (connection_result == 0)
{
}
else if (connection_result == 1)
{
}
else
{
}
Server-code (inparams: certificate_chain_file
, ca_certificate_file
):
SSL_library_init();
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
SSL_METHOD const * method = SSLv23_method();
SSL_CTX * ctx = SSL_CTX_new(method);
SSL_CTX_use_certificate_chain_file(ctx, certificate_chain_file); //Contains only root CA
SSL_CTX_set_default_passwd_cb_userdata(ctx, (void *) private_key_file_password);
SSL_CTX_set_default_passwd_cb(ctx, pem_passwd_cb);
SSL_CTX_load_verify_locations(ctx, ca_certificate_file, NULL);
struct sockaddr_in addr;
int server_sd = create_socket(addr, 6789);
bind(server_sd, (struct sockaddr *) &addr, sizeof(addr));
listen(server_sd, max_nr_of_simultaneous_connections);
sockaddr_in client;
client.sin_family = AF_INET;
socklen_t c_len = sizeof(client);
int client_sd = accept(server_sd, (sockaddr *) &client, &c_len);
char remote_addr[INET_ADDRSTRLEN];
inet_ntop(client.sin_family, &(client.sin_addr), remote_addr, INET_ADDRSTRLEN);
SSL * ssl = SSL_new(ctx);
SSL_set_fd(ssl, client_sd);
const char * const preferred_ciphers = "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4";
SSL_set_cipher_list(ssl, preferred_ciphers); //<<< Added
STACK_OF(X509_NAME) * cert_names = SSL_load_client_CA_file(certificate_chain_file);
if (cert_names != NULL)
{
SSL_CTX_set_client_CA_list(ctx, cert_names);
}
mydata_t mydata;
mydata_index_server = SSL_get_ex_new_index(0, (void *) "mydata index", NULL, NULL, NULL);
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, verify_callback_server);
SSL_CTX_set_verify_depth(ctx, 1);
mydata.verify_depth = 1;
SSL_set_ex_data(ssl, mydata_index_server, &mydata);
int accept_result = SSL_accept(ssl);
if (accept_result == 0)
{
}
else if (accept_result < 0)
{
//Comes in here and ERR_get_error indicates
//error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher
}
BEARBEITET:
jww, ich habe versucht, die Dinge, die Sie unten vorgeschlagen. Aber ohne Fortschritt; ich bekomme immer noch die gleiche Fehlermeldung ausgegeben.
Dies ist, wie ich habe meine Zertifikate:
openssl-ca.cnf
HOME = .
RANDFILE = $ENV::HOME/.rnd
####################################################################
[ ca ]
default_ca = CA_default # The default ca section
####################################################################
[ CA_default ]
default_days = 1000 # how long to certify for
default_crl_days = 30 # how long before next CRL
default_md = sha256 # use public key default MD
preserve = no # keep passed DN ordering
x509_extensions = ca_extensions # The extensions to add to the cert
email_in_dn = no # Don't concat the email in the DN
copy_extensions = copy # Required to copy SANs from CSR to cert
base_dir = .
certificate = $base_dir/certs/ca_fromweb.cert.pem # The CA certifcate
private_key = $base_dir/private/ca.key.pem # The CA private key
new_certs_dir = $base_dir # Location for new certs after signing
database = $base_dir/index2.txt # Database index file
serial = $base_dir/serial2.txt # The current serial number
unique_subject = no # Set to 'no' to allow creation of
# several certificates with same subject.
####################################################################
[ req ]
default_bits = 4096
default_keyfile = ./private/ca.key.pem
distinguished_name = ca_distinguished_name
x509_extensions = ca_extensions
string_mask = utf8only
####################################################################
[ ca_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = SE
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Östergötland
localityName = Locality Name (eg, city)
localityName_default =
organizationName = Organization Name (eg, company)
organizationName_default =
organizationalUnitName = Organizational Unit (eg, division)
organizationalUnitName_default =
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default =
emailAddress = Email Address
emailAddress_default =
####################################################################
[ ca_extensions ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer
basicConstraints = critical, CA:true
keyUsage = keyCertSign, cRLSign
####################################################################
[ signing_policy ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
####################################################################
[ signing_req ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
openssl-server.cnf
HOME = .
RANDFILE = $ENV::HOME/.rnd
####################################################################
[ req ]
default_bits = 2048
default_keyfile = ./intermediate/private/my.example.com.key.pem
distinguished_name = server_distinguished_name
req_extensions = server_req_extensions
string_mask = utf8only
####################################################################
[ server_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = SE
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Östergötland
localityName = Locality Name (eg, city)
localityName_default = Linköping
organizationName = Organization Name (eg, company)
organizationName_default =
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default =
emailAddress = Email Address
emailAddress_default =
####################################################################
[ server_req_extensions ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
####################################################################
[ alternate_names ]
DNS.1 = my.example.com
Befehle
touch index.txt
echo 1000 > serial
openssl genrsa -aes256 -out ca.key.pem 4096
chmod 400 private/ca.key.pem
openssl req -config openssl-ca.cnf -key ca.key.pem -new -x509 -days 7300 -sha256 -extensions ca_extensions -out ca.cert.pem
chmod 444 ca.cert.pem
openssl genrsa -aes256 -out server.key.pem 4096
openssl req -config openssl-server.cnf -new -sha256 -key server.key.pem -out my.example.com.csr.pem
openssl ca -config openssl-ca.cnf -policy signing_policy -extensions signing_req -out my.example.com.cert.pem -infiles my.example.com.csr.pem
chmod 444 my.example.com.cert.pem
cat ca.cert.pem > ca_chain.cert.pem
EDIT 2: habe Auch versucht mit
ERR_load_crypto_strings(); //<<< To clarify my initialization (2)
OpenSSL_add_all_ciphers(); //<<< To clarify my initialization (2)
Siehe oben. Gleichen Ergebnis.
"Leider, sind alle Initialisierungs-Funktion Rückkehr eine nutzlose Werte (z.B. immer 1) oder void-Funktionen. Es gibt keine Möglichkeit festzustellen, ob ein Fehler aufgetreten ist. "- (https://wiki.openssl.org/index.php/Library_Initialization) das nervt!
InformationsquelleAutor Joachim | 2016-11-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte es mehrere Gründe für. Unten sind einige Vorschläge, die je nach problem, das Sie haben. Ich vermute, einer oder mehr, ist die Antwort auf Ihre Probleme.
Und:
Sollten Sie beginnen, indem Sie die Einstellung "TLS 1.0 und höher". Sie würde tun, dass auf dem client und server mit dem folgenden. Seine aus dem OpenSSL-wiki und SLL/TLS-Client Beispiel.
Ihrem client auch nutzen sollte Server Name Indication (SNI). Der client nutzt es mit
SSL_set_tlsext_host_name
. SNI ist eine TLS-Erweiterung, und es ist Teil der Grund, Sie wollen "TLS 1.0 und höher".Sowohl der client und der server verwenden möchten, eine cipher-suite-Liste wie
"HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4"
. Legen Sie Sie entweder mitSSL_CTX_set_cipher_list
oderSSL_set_cipher_list
. Es vermeidet die "Ihre Verbindung zu der website ist verschlüsselt mit veralteter Kryptographie" Warnungen vom browser.Wenn Sie sind mit Elliptischen Kurven basierte Zertifikate, dann müssen Sie eine benannte Kurve. Siehe auch boost asio mit ECDSA Zertifikat Problem auf Stack Overflow und Elliptic Curve Cryptography | Named Kurven auf die OpenSSL-wiki.
Werden Sie sicher, dass Sie initialisieren der OpenSSL-Bibliothek. Wenn die Bibliothek nicht ordnungsgemäß initialisiert ist, dann wird es keine verfügbaren Chiffren, und es kann in "keine gemeinsamen Chiffren". Siehe auch Openssl SSL_CTX_new(SSLv3_method()) den Wert NULL zurück auf Stack Overflow und Bibliothek Initialisierung auf die OpenSSL-wiki.
Wenn Sie ein eigenes Zertifikat, dann werden Sie sicher, dass Sie setzen Hostnamen in der in der Subject Alternative Name (SAN). Hostnamen gehen immer in die SAN. Wenn seine Gegenwart in der CN, dann muss es vorhanden sein, in der SAN auch (Sie die Liste zweimal in diesem Fall). Für mehr Regeln und Gründe, siehe Wie meldet man Certificate Signing Request mit Ihrer Zertifizierungsstelle und So erstellen Sie ein selbst-signiertes Zertifikat mit openssl?
Ich habe keine Ideen über eine Eingabeaufforderung. Ich habe nie gesehen, dass OpenSSL-API-Aufforderung für alles, es sei denn, ein paar APIs aufgerufen werden. Keine von diesen sind in dem code oben. Vielleicht sollten Sie sich Fragen, über die Befehle, die Sie Probleme mit in Super User oder Unix & Linux Stack Exchange.
Wie es scheint, hinzufügen -neuen -sha256 gab mir wieder die Eingabeaufforderung. Ich habe meinen Beitrag oben aktualisiert mit den Ergebnissen Ihrer Vorschläge.
InformationsquelleAutor jww
Einige ältere OpenSSL-Versionen, wie man in RHEL 7.x benötigen einen expliziten Aufruf
SSL_CTX_set_ecdh_auto()
bei der Initialisierung der Bühne zu ermöglichen, die Verhandlung von fortschrittlichen algorithmen. Siehe z.B. https://wiki.openssl.org/index.php/Simple_TLS_ServerInformationsquelleAutor ayurchen