2016-03-31 2 views
1

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):

enter image description here

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 à sslvSSLv23un 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éfaut sslmUnassigned, 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 de sslvTLSv3 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 

Répondre

1

Mais TLS 1.1 et TLS 1.2 sont manquantes.

droit, parce que si vous définissez l'Method-sslvTLSv1, Indy n'utilisera spécifiquement TLS 1.0.

Votre capture d'écran de l'inspecteur d'objets montre clairement que vous utilisez une version d'Indy qui ne prend pas en charge TLS 1.1+ (si vous étiez, il y aurait sslvTLSv1_1 et sslvTLSv1_2 options disponibles dans la propriété SSLVersions).

Notez que si je ne «laisser de côté sslvTLSv2 (méthode est sslvSSLv23 et SSLVersions est [sslvSSLv3, sslvTLSv1]), nmap me dit:

Lorsque le Method est sslvSSLv23, Indy désactive simplement indésirable Versions SSL/TLS, dans ce cas SSLv2. Vous utilisez clairement une version de la bibliothèque OpenSSL qui prend en charge TLS 1.1+. Donc, parce que votre version d'Indy ne supporte pas TLS 1.1+, elle ne les désactive pas. Ils sont activés par défaut. Puisque vous ne désactivez pas TLS 1.0, TLS 1.1+ reste implicitement activé par OpenSSL lui-même.

Que puis-je faire pour que seules les versions TLS 1.x soient prises en charge?

C'est un peu d'une solution bizarre, mais vous pouvez régler le SSLVersions-[sslvSSLv23,sslvTLSv1]. Cela va définir le Method à sslvSSLv23 et supprimer sslvSSLv23 du SSLVersions. De cette façon, Indy utilisera le caractère générique SSLv23 et désactivera SSLv2 et SSLv3, laissant TLS 1.0+ activé.

Malheureusement, vous ne pouvez pas vraiment créer cette configuration dans l'inspecteur d'objets au moment du design. Eh bien, vous pouvez (activer d'abord sslvTLSv1, puis activer ssvSSLv23 ensuite), mais il ne sera pas enregistré dans le DFM correctement (le SSLVersions sera omis puisque [sslvTLSv1] est la valeur par défaut), et finira donc par être réactivé SSLv2 et SSLv3 au moment de l'exécution. Pour éviter cela, vous devrez attribuer le SSLVersions dans le code lors de l'exécution, avant d'activer votre serveur:

IdServerIOHandlerSSLOpenSSL1.SSLOptions.SSLVersions := [sslvSSLv23,sslvTLSv1]; 

Sinon, l'alternative est de passer à une version mise à jour de Indy qui prend en charge nativement TLS 1.1+, alors vous pouvez simplement définir SSLVersions à [sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2] (au moment de l'exécution ou de la conception) et passer à autre chose.

+0

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. –