Question Comment lister les suites de chiffrement SSL / TLS offertes par un site Web particulier?


Comment puis-je récupérer une liste des suites de chiffrement SSL / TLS offertes par un site Web particulier?

J'ai essayé openssl, mais si vous examinez la sortie:

$ echo -n | openssl s_client -connect www.google.com:443 
CONNECTED(00000003)
depth=1 /C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
   i:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
 1 s:/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
   i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDITCCAoqgAwIBAgIQL9+89q6RUm0PmqPfQDQ+mjANBgkqhkiG9w0BAQUFADBM
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0wOTEyMTgwMDAwMDBaFw0x
MTEyMTgyMzU5NTlaMGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh
MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRcw
FQYDVQQDFA53d3cuZ29vZ2xlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
gYEA6PmGD5D6htffvXImttdEAoN4c9kCKO+IRTn7EOh8rqk41XXGOOsKFQebg+jN
gtXj9xVoRaELGYW84u+E593y17iYwqG7tcFR39SDAqc9BkJb4SLD3muFXxzW2k6L
05vuuWciKh0R73mkszeK9P4Y/bz5RiNQl/Os/CRGK1w7t0UCAwEAAaOB5zCB5DAM
BgNVHRMBAf8EAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwudGhhd3Rl
LmNvbS9UaGF3dGVTR0NDQS5jcmwwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUF
BwMCBglghkgBhvhCBAEwcgYIKwYBBQUHAQEEZjBkMCIGCCsGAQUFBzABhhZodHRw
Oi8vb2NzcC50aGF3dGUuY29tMD4GCCsGAQUFBzAChjJodHRwOi8vd3d3LnRoYXd0
ZS5jb20vcmVwb3NpdG9yeS9UaGF3dGVfU0dDX0NBLmNydDANBgkqhkiG9w0BAQUF
AAOBgQCfQ89bxFApsb/isJr/aiEdLRLDLE5a+RLizrmCUi3nHX4adpaQedEkUjh5
u2ONgJd8IyAPkU0Wueru9G2Jysa9zCRo1kNbzipYvzwY4OA8Ys+WAi0oR1A04Se6
z5nRUP8pJcA2NhUzUnC+MY+f6H/nEQyNv4SgQhqAibAxWEEHXw==
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
issuer=/C=ZA/O=Thawte Consulting (Pty) Ltd./CN=Thawte SGC CA
---
No client certificate CA names sent
---
SSL handshake has read 1777 bytes and written 316 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 1024 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: 748E2B5FEFF9EA065DA2F04A06FBF456502F3E64DF1B4FF054F54817C473270C
    Session-ID-ctx: 
    Master-Key: C4284AE7D76421F782A822B3780FA9677A726A25E1258160CA30D346D65C5F4049DA3D10A41F3FA4816DD9606197FAE5
    Key-Arg   : None
    Start Time: 1266259321
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---

cela montre juste que la suite de chiffrement est quelque chose avec AES256-SHA. Je sais que je pourrais passer à travers la décharge de la conversation, mais j'espérais quelque chose d'un peu plus élégant.

Je préférerais le faire sous Linux, mais Windows (ou autre) serait bien. Cette question est motivée par les tests de sécurité que je fais pour les tests PCI et les tests de pénétration généraux.

Mettre à jour: 

GregS indique ci-dessous que le serveur SSL choisit parmi les suites de chiffrement du client. Il semble donc que je devrais tester toutes les suites de chiffrement une par une. Je pense que je peux pirater quelque chose ensemble, mais existe-t-il un moyen plus simple, plus évolutif (par exemple de nouveaux codes) de le faire?


229
2018-02-15 18:47


origine


Peut être gnutls-cli? - grawity
Après le changement de titre, cette question ne demande pas vraiment un logiciel rec. Vote pour rouvrir. - Bob
@ fixer1234 Si cela vous rend plus heureux, j'ai supprimé toute occurrence du mot "outil". La question centrale est de savoir comment accomplir une tâche spécifique de toute façon; c'est une reformulation mineure et loin des questions de type "liste de logiciels" plus ouvertes. - Bob
@Bob: Je suis extatique. :-) Vote pour rouvrir. - fixer1234


Réponses:


J'ai écrit un script bash pour tester les suites de chiffrement. Il obtient une liste des suites de chiffrement prises en charge par OpenSSL et tente de se connecter avec chacune d’elles. Si la poignée de main réussit, elle imprime YES. Si la poignée de main ne réussit pas, elle imprime NO, suivi du texte d'erreur OpenSSL.

#!/usr/bin/env bash

# OpenSSL requires the port number.
SERVER=$1
DELAY=1
ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g')

echo Obtaining cipher list from $(openssl version).

for cipher in ${ciphers[@]}
do
echo -n Testing $cipher...
result=$(echo -n | openssl s_client -cipher "$cipher" -connect $SERVER 2>&1)
if [[ "$result" =~ ":error:" ]] ; then
  error=$(echo -n $result | cut -d':' -f6)
  echo NO \($error\)
else
  if [[ "$result" =~ "Cipher is ${cipher}" || "$result" =~ "Cipher    :" ]] ; then
    echo YES
  else
    echo UNKNOWN RESPONSE
    echo $result
  fi
fi
sleep $DELAY
done

Voici un exemple de sortie montrant 3 chiffrements non pris en charge et 1 chiffrement pris en charge:

[@linux ~]$ ./test_ciphers 192.168.1.11:443
Obtaining cipher list from OpenSSL 0.9.8k 25 Mar 2009.
Testing ADH-AES256-SHA...NO (sslv3 alert handshake failure)
Testing DHE-RSA-AES256-SHA...NO (sslv3 alert handshake failure)
Testing DHE-DSS-AES256-SHA...NO (sslv3 alert handshake failure)
Testing AES256-SHA...YES

EDIT: Ajoute de la flexibilité car l'hôte et le port sont fournis en paramètre du script


199
2017-12-20 23:41



openssl 1.0 nécessite un changement: if [[ "$result" =~ "Cipher :" ]] ; then au lieu de if [[ "$result" =~ "Cipher is " ]] ; then Je teste également pour SSL2 et sécurise la renégociation: echo -n Testing ssl2... result=$(echo -n | openssl s_client -ssl2 -connect $SERVER 2>&1) if [[ "$result" =~ "Cipher :" ]] ; then echo supported. INSECURE! else echo no support, OK fi echo -n Testing SSL secure renegotiation... echo -n "" | openssl s_client -connect $SERVER 2>&1 | grep 'Secure Renegotiation' - Hubert Kario
Il existe un autre script shell très sophistiqué qui utilise sslscan et openssl: TLSSLed - Robert
J'ai énuméré ci-dessous un autre script qui nécessite seulement OpenSSL appelé CipherScan - Olivier - interfaSys
Notez que ce script probablement pas vous indiquer si un serveur prend en charge les suites de chiffrement que OpenSSL ne prend pas en charge. - sampablokuper
La suggestion de @Robert pour TLSSLed était fantastique. Il a été mis à jour en 1.3 et a beaucoup plus de fonctionnalités. J'ai utilisé pour des tests de sécurité et je dois dire que je suis impressionné. - John Yeary


Nmap avec ssl-enum-ciphers

Il n'y a pas de moyen meilleur ou plus rapide pour obtenir une liste des chiffrements disponibles à partir d'un service réseau. Plus, nmap fournira une cote de force forte, faible ou inconnue pour chaque chiffre disponible.

Tout d'abord, téléchargez le ssl-enum-ciphers.nse script nmap (explication ici). Ensuite, à partir du même répertoire que le script, exécutez nmap comme suit:

Liste des chiffrements pris en charge par un serveur HTTP

$ nmap --script ssl-enum-ciphers -p 443 www.example.com

Liste des chiffrements pris en charge par un serveur IMAP

$ nmap --script ssl-enum-ciphers -p 993 mail.example.com

Voici un extrait de sortie d'un serveur IMAP Dovecot:

993/tcp open  imaps
| ssl-enum-ciphers:
|   SSLv3:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_IDEA_CBC_SHA - weak
...
|   TLSv1.0:
|     ciphers:
|       TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_IDEA_CBC_SHA - weak
...
|_  least strength: weak

Nmap done: 1 IP address (1 host up) scanned in 1.03 seconds

128
2018-06-05 09:29



Est-il possible d'utiliser ce script sur IMAP avec STARTTLS? STARTTLS sur SMTP semble fonctionner, mais sur IMAP, le script ne semble même pas fonctionner. - Giel
Quelques points: vous pouvez exécuter le script dans votre distribution nmap, plutôt que celui que vous avez téléchargé. Vérifiez en renommant le vôtre. Ensuite, vérifiez le "portrule" qui dans certaines versions vérifie les numéros de port couramment utilisés. Remplacer par portrule = function() \n return true \n end - slim
... et il faudrait du piratage pour travailler avec IMAP STARTTLS, FTPS AUTH TLS etc, mais c'est possible. - slim
Une mise en garde est que les scripts plus anciens, qui peuvent être inclus dans votre distribution / package, listent les codes en ordre alphabétique, ne pas ordre préféré du serveur (ou du client). Voir le commentaire ci-dessus de @slim - Clint Pachl
Au cours des deux années écoulées depuis la rédaction de cette réponse, Nmap a ajouté la prise en charge de STARTTLS via FTP, NNTP, IMAP, LDAP, POP3, PostgreSQL, SMTP, XMPP, VNC et MS SQL. . - bonsaiviking


Y a-t-il un outil capable de tester quoi?   Suites de chiffrement SSL / TLS un particulier   offres de site web?

Oui, vous pouvez utiliser l'outil en ligne sur SSL Labs'site Web pour interroger la base de données du serveur SSL public.

Voici un extrait d'informations qu'il fournit:

alt text

(capture d'écran des résultats de google.com)


94
2018-02-20 18:02



cool, merci pour trouver ça. - James K Polk
C'est exactement ce que je cherchais! Merci beaucoup! - Jeremy Powell
Malheureusement, il ne prend en charge que HTTPS sur le port standard, ne peut pas l'utiliser pour vérifier POP3S, IMAPS ou IMAP avec TLS - Hubert Kario
Et bien qu'il ne supporte que HTTPS, il manque même de support pour SNI. - Gurken Papst
Et bien que ce soit idéal pour les sites publics, vous ne pouvez pas l'utiliser pour des sites sur des réseaux isolés d'Internet. - Iszi


sslscan est un joli petit utilitaire.

Il teste la connexion avec TLS et SSL (et le script de génération peut être associé à sa propre copie d'OpenSSL afin que les versions SSL obsolètes soient également vérifiées) et génère des rapports sur les suites de chiffrement et le certificat du serveur.

Exemple de sortie pour google.com (réduit pour plus de lisibilité):

$ sslscan google.com
Testing SSL server google.com on port 443

 TLS renegotiation:
Secure session renegotiation supported

  TLS Compression:
Compression disabled

  Heartbleed:
TLS 1.2 not vulnerable to heartbleed
TLS 1.1 not vulnerable to heartbleed
TLS 1.0 not vulnerable to heartbleed

  Supported Server Cipher(s):
Preferred TLSv1.2  128 bits  ECDHE-RSA-AES128-GCM-SHA256   Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  AES128-GCM-SHA256
Accepted  TLSv1.2  128 bits  AES128-SHA
<snip>
Preferred TLSv1.1  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.1  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.1  128 bits  AES128-SHA
<snip>
Preferred TLSv1.0  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.0  128 bits  ECDHE-RSA-RC4-SHA             Curve P-256 DHE 256
Accepted  TLSv1.0  128 bits  AES128-SHA
<snip>
Preferred SSLv3    128 bits  RC4-SHA
Accepted  SSLv3    128 bits  RC4-MD5
<snip>

  SSL Certificate:
Signature Algorithm: sha256WithRSAEncryption
RSA Key Strength:    2048

Subject:  *.google.com
Altnames: DNS:*.google.com, DNS:*.android.com, <snip>
Issuer:   Google Internet Authority G2

Not valid before: Apr  7 08:24:31 2016 GMT
Not valid after:  Jun 30 08:20:00 2016 GMT

47
2018-03-18 22:21



yum install sslscan fonctionne sur CentOS 6. - a coder
sudo dnf install sslscan sur Fedora 22 également. - Zayne S Halsall
brew install sslscan sur OSX - Xiao
sudo apt-get install sslscan sur Ubuntu (12.04 - toutes les versions ultérieures devraient donc convenir). - balu
Mise à jour: il convient de noter que la version officielle de sslscan se trouve dans les référentiels Debian et Ubuntu (actuellement 1.8.2 à partir de 2009) ne fait pas soutenir TLS v1.1 et 1.2, voir bugs.launchpad.net/ubuntu/+source/sslscan/+bug/1372741. Il faut donc utiliser la version sur GitHub à laquelle l’OP est lié. - balu


Comme il s'agit d'un excellent outil de référence pour les outils d'analyse SSL, je vais lister CipherScan qui a été créé il y a un an et qui peut également identifier les problèmes liés aux chiffrements d'échange de clés. https://github.com/jvehent/cipherscan

Si vous voulez mon fork qui supporte SNI et FreeBSD, l’URL est https://github.com/oparoz/cipherscan

C'est un script qui appelle openssl s_clientet prend en charge l'utilisation de votre propre binaire OpenSSL afin que vous puissiez tester les fonctionnalités à venir ou de nouveaux chiffrements (chacha20 + poly1305 par exemple).

Il vous permet également de vous connecter à n'importe quel port de votre choix et d'utiliser starttlss.

Voici une sortie typique

# ./cipherscan -o ./openssl api.mycompany.com:443
...................
prio  ciphersuite                  protocols              pfs_keysize
1     DHE-RSA-AES256-GCM-SHA384    TLSv1.2                DH,4096bits
2     DHE-RSA-AES256-SHA256        TLSv1.2                DH,4096bits
3     ECDHE-RSA-AES256-GCM-SHA384  TLSv1.2                ECDH,P-384,384bits
4     ECDHE-RSA-AES256-SHA384      TLSv1.2                ECDH,P-384,384bits
5     DHE-RSA-AES128-GCM-SHA256    TLSv1.2                DH,4096bits
6     DHE-RSA-AES128-SHA256        TLSv1.2                DH,4096bits
7     ECDHE-RSA-AES128-GCM-SHA256  TLSv1.2                ECDH,P-384,384bits
8     ECDHE-RSA-AES128-SHA256      TLSv1.2                ECDH,P-384,384bits
9     DHE-RSA-CAMELLIA256-SHA      TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
10    DHE-RSA-AES256-SHA           TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
11    ECDHE-RSA-AES256-SHA         TLSv1,TLSv1.1,TLSv1.2  ECDH,P-384,384bits
12    DHE-RSA-CAMELLIA128-SHA      TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
13    DHE-RSA-AES128-SHA           TLSv1,TLSv1.1,TLSv1.2  DH,4096bits
14    ECDHE-RSA-AES128-SHA         TLSv1,TLSv1.1,TLSv1.2  ECDH,P-384,384bits
15    CAMELLIA256-SHA              TLSv1,TLSv1.1,TLSv1.2
16    AES256-SHA                   TLSv1,TLSv1.1,TLSv1.2
17    CAMELLIA128-SHA              TLSv1,TLSv1.1,TLSv1.2
18    AES128-SHA                   TLSv1,TLSv1.1,TLSv1.2

Certificate: trusted, 4096 bit, sha256WithRSAEncryption signature
TLS ticket lifetime hint: 300
OCSP stapling: supported

Et voici une liste d'options

-a | --allciphers   Test all known ciphers individually at the end.
-b | --benchmark    Activate benchmark mode.
-d | --delay        Pause for n seconds between connections
-D | --debug        Output ALL the information.
-h | --help         Shows this help text.
-j | --json         Output results in JSON format.
-o | --openssl      path/to/your/openssl binary you want to use.
-v | --verbose      Increase verbosity.

La sortie json est utile si vous appelez cela depuis d'autres scripts.


14
2017-09-16 11:25



"big-SSLv3 config not supported, la connexion a échoué" - a coder


https://github.com/iSECPartners/sslyze

Celui-ci est basé sur Python, fonctionne sous Linux / Mac / Windows en ligne de commande.


12
2018-01-25 14:01





Après un peu de googler, j'ai trouvé ça Test pour SSL-TLS (OWASP-CM-001):

le nmap Le scanner, via l'option de numérisation "-sV", est capable d'identifier les services SSL. Les scanners de vulnérabilité, en plus de la recherche de services, peuvent inclure des vérifications par rapport aux codes de chiffrement faibles (par exemple, le Scanner Nessus a la capacité de vérifier les services SSL sur des ports arbitraires, et signalera des codes de chiffrement faibles.

et aussi: Foundstone SSL Digger est un outil pour évaluer la force des serveurs SSL en testant les chiffrements pris en charge. Certains de ces chiffres sont connus pour être peu sûrs.


8
2018-02-20 16:30





J'utilise pour la plupart des tests SSL testssl.sh (voir https://testssl.sh / version de développement @ https://github.com/drwetter/testssl.sh. Il teste les vulnérabilités, les chiffrements, les protocoles, etc.


4
2018-01-10 17:36





SSLScan est génial; un nouvel outil SSLDiagnos fonctionne pour Windows, ou vous pouvez simplement écrire un script en utilisant le fichier openssl s_client.


2
2017-12-01 20:40





Nmap ssl-enum-ciphers Le script peut répertorier les chiffrements et les versions SSL / TLS pris en charge, ainsi que les compresseurs pris en charge.


2
2018-03-25 21:58



Votre réponse était antérieure, mais Clint Pachl's  répondre explique ssl-enum-ciphers beaucoup plus globalement. - sampablokuper


Si vous voulez une belle sortie grepable (et un support pour vérifier toutes les versions SSL / TLS)

Utilisation: ./script.sh www.url.com

#!/usr/bin/env bash
ciphers2=$(openssl ciphers -ssl2 'ALL:eNULL' | sed -e 's/:/ /g')
ciphers3=$(openssl ciphers -ssl3 'ALL:eNULL' | sed -e 's/:/ /g')
cipherst1=$(openssl ciphers -tls1 'ALL:eNULL' | sed -e 's/:/ /g')
cipherst11=$(openssl ciphers -tls1.1 'ALL:eNULL' | sed -e 's/:/ /g')
cipherst12=$(openssl ciphers -tls1.2 'ALL:eNULL' | sed -e 's/:/ /g')

SSL2="SSL2("
for cipher in ${ciphers2[@]}
do
result=$(echo -n | openssl s_client -ssl2 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  SSL2="${SSL2}${cipher}:"
fi
done
SSL2=$(echo "${SSL2})" | sed -e 's/:)/)/g')

SSL3="SSL3("
for cipher in ${ciphers3[@]}
do
result=$(echo -n | openssl s_client -ssl3 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  SSL3="${SSL3}${cipher}:"
fi
done
SSL3=$(echo "${SSL3})" | sed -e 's/:)/)/g')
TLS1="TLS1("
for cipher in ${cipherst1[@]}
do
result=$(echo -n | openssl s_client -tls1 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  TLS1="${TLS1}${cipher}:"
fi
done
TLS1=$(echo "${TLS1})" | sed -e 's/:)/)/g')

TLS11="TLS1.1("
for cipher in ${cipherst11[@]}
do
result=$(echo -n | openssl s_client -tls1_1 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  TLS11="${TLS11}${cipher}:"
fi
done
TLS11=$(echo "${TLS11})" | sed -e 's/:)/)/g')

TLS12="TLS1.2("
for cipher in ${cipherst12[@]}
do
result=$(echo -n | openssl s_client -tls1_2 -cipher "$cipher" -connect $1:443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  TLS12="${TLS12}${cipher}:"
fi
done
TLS12=$(echo "${TLS12})" | sed -e 's/:)/)/g')

echo "$1,$SSL2,$SSL3,$TLS1,$TLS11,$TLS12";

2
2018-04-09 18:31



Vous effectuez openssl ciphers -tls1.1 et openssl ciphers -tls1.2 Cependant, ces paramètres ne semblent pas exister ... Il n'y a que -tls1 (au moins sur les plates-formes que j'ai essayées). - Marki
(Il semble y avoir des options supplémentaires sous la forme de tls1_1 et tls1_2 mais ils ne sont affichés que sur le version principale de openssl et même pas en 1.0.2 ....) - Marki
Notez que ce script probablement pas vous indiquer si un serveur prend en charge les suites de chiffrement que OpenSSL ne prend pas en charge. - sampablokuper