Comment dois-je procéder à la mise à niveau de TLS 1.2?
Pour répondre aux exigences techniques, il suffit d'utiliser OpenSSL 1.0.1 ou 1.0.2. Les deux fournissent TLS 1.2, et les deux fournissent trivialement SHA-256. (Il y a d'autres accomplissements cachés, comme OpenSSL 1.0.0 ne fournit pas le complément complet de l'équipement EC et le complément complet des suites de chiffrement TLS 1.2, mais 1.0.1 et 1.0.2 le font).
Dans votre code C qui utilise OpenSSL, tout ce que vous devez faire pour le contexte SSL ou Session:
/* Useless return value ??? */
SSL_library_init();
const SSL_METHOD* method = SSLv23_method();
if(NULL == method) handleFailure();
SSL_CTX* ctx = SSL_CTX_new(method);
if(ctx == NULL) handleFailure();
/* Cannot fail ??? */
const long flags = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | \
SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_COMPRESSION;
SSL_CTX_set_options(ctx, flags);
Pour les configurations de serveur Apache comme, utiliser quelque chose comme ce qui suit (le mien comprend +TLSv1 +TLSv1.1
):
# From my CentOS production server
SSLProtocol -all +TLSv1.2
Vous devriez probablement tendance à les suites de chiffrement, aussi. Pour cela, en C-code:
const char CIHPHER_LIST[] = "HIGH:!aNULL:!RC4:!MD5"
/* Ensure at least one cipher suite is added, which indicates non-failure */
int rc = SSL_CTX_set_cipher_list(ctx, CIHPHER_LIST);
if(!(rc >= 1)) handleFailure();
Et dans un fichier de configuration Apache comme:
# From my CentOS production server
SSLCipherSuite HIGH:!aNULL:!MD5:!RC4
Si vous voulez éviter le transport de clés RSA (TLS 1.3 est le retirer), puis:
SSLCipherSuite HIGH:!aNULL:!MD5:!RC4:!kRSA
Lorsque vous supprimez le transport de clé RSA, vous êtes à peu près à gauche avec les protocoles d'échange de clés éphémères (modulo suites de chiffrement comme PSK et SRP).
Si vous souhaitez utiliser explicitement les échanges de clés éphémères, vous aurez besoin de quelque chose comme kEECDH:kECDHE:kDHE:kEDH:!aNULL
. Voir la page de manuel openssl ciphers(1)
pour plus de détails. Je lis entre les lignes, mais l'exigence TLS 1.2 a probablement quelque chose à voir avec le chiffrement authentifié, et les modes de fonctionnement comme GCM. Pour cela, utilisez openssl ciphers(1)
nouveau:
$ openssl ciphers -v 'HIGH:!aNULL' | grep GCM
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD
DHE-DSS-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=DSS Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD
ECDH-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
ECDH-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
AES256-GCM-SHA384 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD
DHE-DSS-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=DSS Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(128) Mac=AEAD
ECDH-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
ECDH-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
AES128-GCM-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(128) Mac=AEAD
Ou:
$ openssl ciphers -v 'HIGH:!aNULL' | grep GCM | grep -v "Kx=RSA" | cut -d " " -f 1
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-GCM-SHA384
DHE-DSS-AES256-GCM-SHA384
DHE-RSA-AES256-GCM-SHA384
ECDH-RSA-AES256-GCM-SHA384
ECDH-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES128-GCM-SHA256
DHE-DSS-AES128-GCM-SHA256
DHE-RSA-AES128-GCM-SHA256
ECDH-RSA-AES128-GCM-SHA256
ECDH-ECDSA-AES128-GCM-SHA256
Au lieu de spécifier HIGH:!aNULL:!MD5:!RC4:!kRSA
, vous pouvez effectuer les opérations suivantes:
const char CIPHER_LIST[] =
"ECDHE-RSA-AES256-GCM-SHA384:"
"ECDHE-ECDSA-AES256-GCM-SHA384:"
"DHE-DSS-AES256-GCM-SHA384:"
"DHE-RSA-AES256-GCM-SHA384:"
"ECDH-RSA-AES256-GCM-SHA384:"
"ECDH-ECDSA-AES256-GCM-SHA384:"
"ECDHE-RSA-AES128-GCM-SHA256:"
"ECDHE-ECDSA-AES128-GCM-SHA256:"
"DHE-DSS-AES128-GCM-SHA256:"
"DHE-RSA-AES128-GCM-SHA256:"
"ECDH-RSA-AES128-GCM-SHA256:"
"ECDH-ECDSA-AES128-GCM-SHA256:"
/* Ensure at least one cipher suite is added, which indicates non-failure */
int rc = SSL_CTX_set_cipher_list(ctx, CIPHER_LIST);
if(!(rc >= 1)) handleFailure();
Si vous regardez la suite de chiffrement AES256-GCM-SHA384
, vous verrez utilise le transport de clé (Kx=RSA
), donc vous pouvez l'éviter même si son TLS 1.2. Hece la raison pour le grep -v
dessus. Pour être complet, Au=RSA
est correct. Cela signifie simplement que le serveur utilise sa clé RSA pour la signature uniquement. Et en pratique, Au=DSS
est rarement utilisé, ainsi OpenSSL supprimera la suite de chiffrement s'il n'y a pas de clé DSS.
Maintenant, les difficultés devient probablement une distro qui fournit les dernières OpenSSL 1.0.2 et fournit le soutien à long terme. Mes machines CentOS ne le fournissent pas, donc je dois le construire à partir de sources, puis reconstruire chaque bibliothèque ou programme qui dépend d'OpenSSL tout en jouant à ces stupides jeux r-path
.
Dans votre cas, cela ressemble à Apache, PHP, Drupal, MySQL, phpAdmin (est-ce que quelqu'un l'utilise vraiment quand la sécurité est un problème :) et ses amis.
Vous avez déjà répondu à votre question, "Je sais que nous devrons mettre à jour OpenSSL sur notre serveur." Pour prendre en charge TLS1.2, il suffit de mettre à jour openssl vers la version 1.0.1 ou ultérieure. –
Quelle est la configuration système requise pour la mise à niveau vers OpenSSL 1.0.1? – AllisonC
Comment pouvons-nous faire en sorte que notre serveur utilise SHA2? – AllisonC