Comment append PFS au serveur de socket écrit en c et openssl

J’essaie d’append PFS (Perfect Forward Secret) à mon application client-serveur.

Quand je lance un serveur avec la commande suivante:

openssl s_server -key ./key.pem -cert ./cert.pem -accept 443 -cipher ECDHE-RSA-AES128-SHA -tls1_2 

Je suis en mesure de me connecter à mon client à l’aide du ctx suivant:

 SSL_CTX* initCTX() { SSL_METHOD *method; SSL_CTX *ctx; SSL_library_init(); OpenSSL_add_all_algorithms(); SSL_load_error_ssortingngs(); method = TLSv1_2_client_method(); ctx = SSL_CTX_new(method); if(ctx == NULL) { ERR_print_errors_fp(stderr); return NULL; } SSL_CTX_set_cipher_list(ctx, "ECDHE-RSA-AES128-SHA"); return ctx; } 

Lorsque j’exécute mon application serveur avec le ctx suivant:

 SSL_CTX* init_ssl_ctx() { SSL_METHOD const *method; SSL_CTX *ctx; SSL_library_init(); OpenSSL_add_all_algorithms(); SSL_load_error_ssortingngs(); method = TLSv1_2_server_method(); ctx = SSL_CTX_new(method); if(ctx == NULL) { ERR_print_errors_fp(stderr); abort(); } SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF); SSL_CTX_set_cipher_list(ctx, "ECDHE-RSA-AES128-SHA"); // ADDITIONAL CTX MODIFICATIONS TO ENABLE ECDHE SSL_CTX_use_certificatee_file(ctx, "./cert.pem", SSL_FILETYPE_PEM); SSL_CTX_use_PrivateKey_file(ctx, "./key.pem", SSL_FILETYPE_PEM); return ctx; } 

et essayez de vous connecter avec le client, alors je ne reçois no shared cipher erreur de no shared cipher . La clé privée a été créée avec openssl genrsa .

Bien ma question est: comment dois-je modifier le ctx pour append le support ECDHE. Je suppose que je dois sélectionner une courbe et probablement créer et échanger des clés pour chaque connexion.

Ai-je toujours besoin du fichier de clé privée? Et quand oui, à quoi sert-il?

En fait, ce qui me manquait, c’était la configuration des parameters de Diffie-Hellman et la courbe elliptique de Diffie-Hellman. Si vous ne les configurez pas …

les suites de chiffrement PFS seront ignorées en silence .

Vous trouverez plus d’informations et des exemples sur la façon de configurer et d’inclure les parameters Diffie-Hellman et la courbe elliptique Diffie-Hellman dans votre serveur de socket C à l’ adresse suivante : http://wiki.openssl.org/index.php/Diffie-Hellman_parameters

 ... then I get an no shared cipher error. How do I have to modify the ctx to add ECDHE support? 

La suite de chiffrement est un produit des capacités à la fois client et serveur. Je trouve que je dois append 12 à 16 pour que la plupart des clients puissent être accueillis.

Voici la liste de chiffrement que j’utilise. Il inclut les prochaines suites de chiffrement ChaCha et Poly, ainsi que les suites client de niveau inférieur. Si vous ne voulez qu’ECDHE, restz encore plus loin dans la liste.

 // *_CHACHA20_POLY1305 are 3x to 4x faster than existing cipher suites. // http://googleonlinesecurity.blogspot.com/2014/04/speeding-up-and-strengthening-https.html // Use them if available. Normative names can be found at (TLS spec depends on IPSec spec): // http://tools.ietf.org/html/draft-nir-ipsecme-chacha20-poly1305-01 // http://tools.ietf.org/html/draft-mavrogiannopoulos-chacha-tls-02 "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305:" "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305:" "TLS_ECDHE_ECDSA_WITH_CHACHA20_SHA:" "TLS_ECDHE_RSA_WITH_CHACHA20_SHA:" "TLS_DHE_RSA_WITH_CHACHA20_POLY1305:" "TLS_RSA_WITH_CHACHA20_POLY1305:" "TLS_DHE_RSA_WITH_CHACHA20_SHA:" "TLS_RSA_WITH_CHACHA20_SHA:" // Done with bleeding edge, back to TLS v1.2 and below "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:" "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:" "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:" "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:" "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:" "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384:" "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:" "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256:" // TLS v1.0 (with some SSLv3 interop) "TLS_DHE_RSA_WITH_AES_256_CBC_SHA384:" "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256:" "TLS_DHE_RSA_WITH_AES_128_CBC_SHA:" "TLS_DHE_DSS_WITH_AES_128_CBC_SHA:" "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:" "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:" "SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA:" "SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA:" // RSA key transport sucks, but they are needed as a fallback. // For example, microsoft.com fails under all versions of TLS // if they are not included. If only TLS 1.0 is available at // the client, then google.com will fail too. TLS v1.3 is // trying to deprecate them, so it will be interestng to see // what happens. "TLS_RSA_WITH_AES_256_CBC_SHA256:" "TLS_RSA_WITH_AES_256_CBC_SHA:" "TLS_RSA_WITH_AES_128_CBC_SHA256:" "TLS_RSA_WITH_AES_128_CBC_SHA:" 

Les suites de chiffrement ChaCha / Poly sont disponibles dans OpenSSL 1.0.2. Vous pouvez donc tester la mise en œuvre de Google si cela vous intéresse.


Les RFC ne spécifient pas qui sélectionne le chiffrement. Par convention, le serveur respecte généralement les préférences du client. Pour vous assurer que votre serveur sélectionne la suite de chiffrement, vous devez append SSL_OP_CIPHER_SERVER_PREFERENCE aux options de contexte du serveur. Voir SSL_CTX_set_options(3) .