web-dev-qa-db-fra.com

Comment désactiver TLS 1.1 & 1.2 dans Apache?

J'ai un serveur Ubuntu 12.04.2 LTS exécutant Apache 2.2.22 avec mod_ssl et OpenSSL v1.0.1.

Dans ma configuration vhosts (tout le reste dans lequel se comporte comme je m'y attendais), j'ai la ligne SSLProtocol avec -all +SSLv3.

Avec cette configuration, TLS 1.1 et 1.2 sont activés et fonctionnent correctement - ce qui est contre-intuitif pour moi, car je m'attendrais à ce que niquement SSLv3 soit activé étant donné cette configuration.

Je peux très bien activer/désactiver TLSv1 avec -/+TSLv1, et cela fonctionne comme prévu. Mais +/-TLSv1.1 et +/-TLSv1.2 ne sont pas des options de configuration valides - je ne peux donc pas les désactiver de cette façon.

Quant à la raison pour laquelle je voudrais faire cela - j'ai affaire à une application tierce (sur laquelle je n'ai aucun contrôle) qui a un comportement de bogue avec les serveurs compatibles TLS, et je dois la désactiver complètement pour aller de l'avant.

13
Kyle Lowry

Intrigué par ce bogue (et oui, j'ai pu le reproduire), j'ai jeté un œil au code source de la dernière version stable de mod_ssl et a trouvé une explication. Restez avec moi, ça va devenir amateur-stack-overflowish:

Lorsque le SSLProtocol a été analysé, il en résulte un char ressemblant à ceci:

0 1 0 0
^ ^ ^ ^
| | | SSLv1
| | SSLv2
| SSLv3
TLSv1

Lors du lancement d'un nouveau contexte de serveur, TOUS les protocoles disponibles seront activés et le char ci-dessus est inspecté à l'aide de quelques astucieuses opérations ET au niveau du bit pour déterminer quels protocoles doivent être désactivés . Dans ce cas, où SSLv3 est le seul protocole à avoir été explicitement activé, les 3 autres seront désactivés.

OpenSSL prend en charge un paramètre de protocole pour TLSv1.1, mais comme SSLProtocol ne prend pas en compte ces options, il n'est jamais désactivé. OpenSSL v1.0.1 a quelques problèmes connus avec TLSv1.2 mais s'il est pris en charge, je suppose que c'est la même chose pour TLSv1.1; il n'est pas reconnu/géré par mod_ssl et donc jamais désactivé.

Code source Références pour mod_ssl:

SSLProtocol est analysé à la ligne 925 dans pkg.sslmod/ssl_engine_config.c
Les options utilisées dans la fonction ci-dessus sont définies à la ligne 444 dans pkg.sslmod/mod_ssl.h
Tous les protocoles sont activés à la ligne 586 dans pkg.sslmod/ssl_engine_init.c après quoi des protocoles spécifiques sont désactivés sur les lignes suivantes

Comment le désactiver alors?

Vous avez quelques options:

  1. Désactivez-le dans le fichier de configuration OpenSSL avec:
    Protocols All,-TLSv1.1,-TLSv1.2
  2. Réécrire mod_ssl ;-)
23
Mathias R. Jessen

Le problème est également abordé dans les commentaires sur la page Apache mod_ssl: http://httpd.Apache.org/docs/2.2/mod/mod_ssl.html#comment_1136

Si Ubuntu 12.04 avait Apache 2.2.23, le problème ne se serait pas produit. Selon les commentaires, il est possible d'activer TLSv1.1 et TLSv1.2, mais TLSv1.0 est alors également activé:

SSLProtocol All -SSLv2 -SSLv3
2
Coanda

Tout d'abord, vous devez identifier quel est le vhost par défaut pour le port 443 dans votre serveur (le premier vhost SSL chargé par Apache) et éditer son fichier de configuration. La plupart des utilisateurs ont un fichier ssl.conf sur leurs serveurs, avec un vhost pour le port 443 qui y est configuré. Comme le nom de ce fichier commence par "s", il se charge avant les vhosts configurés dans vhosts.conf (qui commence par "v"). Donc, vérifiez si c'est votre cas (la réponse est "oui" pour pratiquement tout le monde) et changez les protocoles dans ce fichier . C'est assez!

Un problème similaire a été publié ici: Comment désactiver TLS 1.1 & 1.2 dans Apache? . Selon HBruijn:

Sauf si vous disposez d'IP VirtualHosts, en pratique, les paramètres de la première occurrence de la directive SSLProtocol sont utilisés pour l'ensemble du serveur et/ou tous les VirtualHosts basés sur le nom prenant en charge TLS

Et un autre ici: Est-il possible de définir un protocole SSL dans Apache pour un seul VirtualHost (caniche)? . Selon vallismortis:

Vous ne pouvez définir le protocole SSL que pour le premier VirtualHost dans le fichier de configuration. Toutes les entrées VirtualHost suivantes hériteront de ce paramètre de la première entrée et ignoreront silencieusement leur propre paramètre en raison d'un bogue OpenSSL.

Soit dit en passant: le vhost par défaut dans un serveur, pour un port donné, est celui qui répond aux demandes pour ce port, qui arrivent au serveur sans identification de nom de serveur (ou avec un nom de serveur incorrect). Exemple: une IP tapée dans la barre d'adresse de votre navigateur ou une redirection erronée provoquée par une table DNS incorrecte.

1
aldemarcalazans