Comment désactiver TLS 1.1 & 1.2 dans Apache?

13

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 SSLProtocolligne 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'attends à ce que seul SSLv3 soit activé dans cette configuration.

Je peux activer / désactiver TLSv1 très bien avec -/+TSLv1, et cela fonctionne comme prévu. Mais +/-TLSv1.1et +/-TLSv1.2ne sont pas des options de configuration valides - donc je ne peux 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.

Kyle Lowry
la source
juste par curiosité - puis-je vous demander pourquoi vous souhaitez désactiver TSL en premier lieu? d'après ce que j'ai rassemblé, il est censé être plus sécurisé que SSLv1 / 2/3, donc je ne peux qu'imaginer des raisons pour vouloir autoriser uniquement la v1.2 et non la v1.1 (c'est ce qui m'a amené ici), mais pas pour le désactiver en faveur de SSL, sauf peut-être quelques problèmes de compatibilité avec des logiciels plus anciens?
codeling
@codeling Utilisation d'anciens logiciels tiers avec des bogues avec TLS.
Kyle Lowry

Réponses:

23

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_sslet trouvé une explication. Restez avec moi, ça va devenir amateur-stack-overflowish:

Lorsque le SSLProtocola été analysé, il en résulte charquelque chose comme 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 ce qui précède charest inspecté à l'aide de quelques opérations ET au niveau du bit astucieux 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 le SSLProtocolne 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é.

Références du code source pour mod_ssl:

SSLProtocolest 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, pkg.sslmod/ssl_engine_init.caprè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;-)
Mathias R. Jessen
la source
On dirait une réponse parfaite, il suffit de vérifier: quel / quoi / où fichier de configuration OpenSSL?
Kyle Lowry
openssl.cnf- l'emplacement dépend de l'installation. Sur Debian Squeeze, je l'ai trouvé sur /etc/ssl/openssl.cnf, dans OS X /System/Library/OpenSSL/openssl.cnfet sur Windows 7 %systemdrive%\openssl\openssl.cnf.
Mathias R. Jessen
1
Je regarde le fichier de configuration maintenant; la syntaxe semble un peu différente de ce à quoi je m'attendais en fonction de votre réponse, et je n'arrive pas à trouver quoi que ce soit en ligne qui indique explicitement que vous pouvez contrôler les protocoles qui sont activés / désactivés à partir de ce fichier de configuration. Avez-vous des références à ce sujet? Merci.
Kyle Lowry
Une autre option - utilisez: SSLProtocolde la même manière ci-dessus ( SSLProtocol All -TLSv1.1 -TLSv1.2(aucune virgule ne devrait être nécessaire)) mais sous une configuration Apache globale ou spécifique pour 'remplacer' toute configuration globale SSL mentionnée ci-dessus. (Si vous ne souhaitez pas modifier tous les chiffrements SSL sous-jacents -> Puisque le chiffrement dont vous avez besoin est considéré comme faible.)
bshea
2

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
Coanda
la source
1

Tout d'abord, vous devez identifier quel est le vhost par défaut pour le port 443 de 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 modifiez 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, dans la 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.

aldemarcalazans
la source