J'essaie de contrôler quels protocoles TLS/SSL sont pris en charge pour les connexions HTTPS à mon service Web, en utilisant un composant TIdServerIOHandlerSSLOpenSSL
et en définissant ses propriétés SSLOptions.Method
et SSLOptions.SSLVersions
(comme suggéré dans this answer).Comment est-ce que je supporte TLS 1.x seulement (dans mon webservice)?
La valeur par défaut est la méthode sslvTLSv1
et SSLVersions [sslvTLSv1]
(voir this answer pour les relations entre la méthode et SSLVersions):
J'utilise nmap avec le script ssl-enum-ciphers.nse
de this answer pour vérifier ce qui est réellement disponible, et obtenir ce script en sortie:
| ssl-enum-ciphers:
| TLSv1.0:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
|_ least strength: C
Mais TLS 1.1 et TLS 1.2 sont manquants.
Si je mets la méthode à sslvSSLv23
(« un caractère générique qui permet la négociation de version dynamique dans les cas où le support client et serveur différentes versions SSL/TLS. Il leur permet de comprendre et utiliser la version la plus commune aux deux parties » (source)) Je vois sslvSSLv2
et sslvSSLv3
devenir actif.
Mais je ne veux pas de support SSL 2.0 (déconseillé/interdit en 2011 par RFC 6176) et 3.0 (déconseillé en juin 2015 par RFC 7568) (source).
Je ne peux pas soustraire à la fois sslvTLSv2
et sslvTLSv3
de l'ensemble généré par la méthode sslvSSLv23
: nous revenons à la configuration par défaut où seul TLS 1.0 est supporté.
Notez que si je ne «laisser de côté sslvTLSv2
(méthode est sslvSSLv23
et SSLVersions est [sslvSSLv3,sslvTLSv1]
), nmap me dit:
| ssl-enum-ciphers:
| SSLv3:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| CBC-mode cipher in SSLv3 (CVE-2014-3566)
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
| TLSv1.0:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
| TLSv1.1:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
| Weak cipher RC4 in TLSv1.1 or newer not needed for BEAST mitigation
| TLSv1.2:
| ciphers:
| TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
| TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_DES_CBC_SHA (rsa 2048) - C
| TLS_RSA_WITH_IDEA_CBC_SHA (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_MD5 (rsa 2048) - A
| TLS_RSA_WITH_RC4_128_SHA (rsa 2048) - A
| TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
| compressors:
| NULL
| cipher preference: client
| warnings:
| Ciphersuite uses MD5 for message integrity
| Weak certificate signature: SHA1
| Weak cipher RC4 in TLSv1.1 or newer not needed for BEAST mitigation
|_ least strength: C
Que puis-je faire pour que seules les versions 1.x TLS sont prise en charge?
Ceci est Delphi XE2 avec Indy 10.5.8.0, fonctionnant sur Win7, testé avec OpenSSL 1.02f. Avec OpenSSL 1.02g je reçois this issue, nous ne sommes pas encore prêts pour notre mise à jour de Delphi Seattle (mise à jour 1) où cela est résolu dans le code Indy.
Notes complémentaires:
Dois-je laisser tomber TLS 1.0 soutien aussi bien?
SSLOptions.Mode
est toujours à la valeur par défautsslmUnassigned
, je veux regarder cela plus tard. Notez que le script nmap teste uniquement les versions SSLv3/TLS et non SSLv2. Je SSLScan en plus, et cela montre que si je laisse desslvTLSv3
que, SSL2 est en effet encore permis ;-(Oublier les informations sur les chiffrements faibles, c'est la prochaine chose à faire face ;-)
Je suis actuellement incapable de faire un test nmap si j'exécute mon webservice dans l'IDE Delphi, cela donne toutes sortes d'erreurs d'exécution (qui ne sont pas visibles si j'exécute l'exécutable).Peut-être que c'est supposé arriver parce que le script nmap déclenche toutes sortes de tests?
EIdOSSLAcceptError 'Error accepting connection with SSL. EOF was observed that violates the protocol.' EIdOSSLUnderlyingCryptoError in ssl3_get_client_hello:no shared cipher EIdOSSLUnderlyingCryptoError in ssl3_get_client_hello:wrong version number
Merci Rémy, ça marche. Heureusement, je faisais déjà tout à l'exécution. Nous travaillons également sur la mise à niveau de XE2 à Seattle dans un proche avenir. –