Jak wyświetlić listę szyfrów SSL / TLS, które oferuje konkretna strona internetowa?


261

Jak mogę pobrać listę zestawów szyfrów SSL / TLS, które oferuje konkretna strona internetowa?

Próbowałem openssl, ale jeśli przyjrzysz się wynikowi:

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

pokazuje po prostu, że pakiet szyfrów jest czymś związanym z AES256-SHA. Wiem, że mogłem przeszukać szesnastkę zrzutu rozmowy, ale liczyłem na coś bardziej eleganckiego.

Wolałbym to zrobić w systemie Linux, ale Windows (lub inny) byłby w porządku. To pytanie jest motywowane przez testy bezpieczeństwa, które przeprowadzam dla PCI i ogólne testy penetracyjne.

Aktualizacja:

GregS wskazuje poniżej, że serwer SSL wybiera pakiety szyfrów klienta. Wygląda więc na to, że musiałbym przetestować wszystkie zestawy szyfrów pojedynczo. Myślę, że mogę zhakować coś razem, ale czy istnieje prostszy, bardziej przyszłościowy (np. Nowe szyfry) sposób, aby to zrobić?


Może gnutls-cli?
grawitacja

Po zmianie tytułu to pytanie tak naprawdę nie wymaga oprogramowania. Głosowanie w celu ponownego otwarcia.
Bob

@ fixer1234 Jeśli to cię uszczęśliwia, usunąłem każde słowo „narzędzie”. Najważniejsze pytanie brzmi: jak wykonać określone zadanie i tak; jest to niewielkie sformułowanie i dalekie od bardziej otwartych pytań typu „lista oprogramowania”.
Bob

@Bob: Jestem zachwycony. :-) Głosowanie, aby ponownie otworzyć.
fixer1234

Odpowiedzi:


232

Napisałem skrypt bash, aby przetestować pakiety szyfrów. Pobiera listę obsługiwanych zestawów szyfrów z OpenSSL i próbuje się połączyć za pomocą każdego z nich. Jeśli uzgadnianie się powiedzie, zostanie wydrukowane YES. Jeśli uzgadnianie nie powiedzie się, zostanie wydrukowane NO, a następnie tekst błędu 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

Oto przykładowe dane wyjściowe przedstawiające 3 nieobsługiwane szyfry i 1 obsługiwany szyfr:

[@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

EDYCJA: Dodaj elastyczność, ponieważ host i port są dostarczane jako parametr do skryptu


7
openssl 1.0 wymaga zmiany: if [[ "$result" =~ "Cipher :" ]] ; thenzamiast if [[ "$result" =~ "Cipher is " ]] ; thentestować również SSL2 i zabezpieczyć renegocjację: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

9
Dostępny jest inny, bardzo wyrafinowany skrypt powłoki, który używa sslscan i openssl: TLSSLed
Robert

2
Poniżej wymieniłem inny skrypt, który wymaga tylko OpenSSL o nazwie CipherScan
Olivier - interfaSys

1
Zauważ, że ten skrypt prawdopodobnie nie powie ci, czy serwer obsługuje pakiety szyfrów, których OpenSSL nie obsługuje.
sampablokuper,

2
Sugestia @Robert dla TLSSLed była fantastyczna. Został zaktualizowany do wersji 1.3 i ma znacznie więcej funkcji. Używam do testów bezpieczeństwa i muszę powiedzieć, że jestem pod wrażeniem.
John Yeary

162

Nmap z szyframi ssl-enum

Nie ma lepszego ani szybszego sposobu na uzyskanie listy dostępnych szyfrów z usługi sieciowej. Ponadto nmap zapewni ocenę wytrzymałości silną, słabą lub nieznaną dla każdego dostępnego szyfru.

Najpierw pobierz skrypt ssl-enum-ciphers.nse nmap ( wyjaśnienie tutaj ). Następnie z tego samego katalogu co skrypt uruchom nmap w następujący sposób:

Lista szyfrów obsługiwanych przez serwer HTTP

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

Lista szyfrów obsługiwanych przez serwer IMAP

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

Oto fragment wyniku z serwera IMO 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

2
Czy jest jakiś sposób na użycie tego skryptu w IMAP z STARTTLS? STARTTLS na SMTP wydaje się działać, ale na IMAP skrypt nawet nie działa.
Giel,

Kilka rzeczy: możesz uruchamiać skrypt w dystrybucji nmap, a nie w pobranym. Sprawdź, zmieniając nazwę swojego. Następnie sprawdź „portrule”, która w niektórych wersjach sprawdza często używane numery portów. Zamień naportrule = function() \n return true \n end
slim

... i wymagałoby trochę włamania do pracy z IMAP STARTTLS, FTPS AUTH TLSitp., ale jest to możliwe.
szczupły

1
Jednym zastrzeżeniem jest to, że starsze skrypty, które mogą być zawarte w twojej dystrybucji / pakiecie, wyświetlają szyfry w kolejności alfabetycznej, a nie preferowane przez serwer (lub klienta). Zobacz powyższy komentarz od @slim
Clint Pachl

3
W ciągu 2 lat od napisania tej odpowiedzi Nmap dodał obsługę STARTTLS przez FTP, NNTP, IMAP, LDAP, POP3, PostgreSQL, SMTP, XMPP, VNC i MS SQL, a także wiele innych ulepszeń poza prostym wyświetlaniem obsługiwanych szyfrów .
bonsaiviking

104

Czy istnieje narzędzie, które może przetestować, jaki szyfr SSL / TLS pasuje do konkretnej witryny internetowej?

Tak, możesz użyć narzędzia online na stronie internetowej SSL Labs , aby wysłać zapytanie do publicznej bazy danych serwera SSL.

Oto fragment informacji, które zawiera:

alternatywny tekst

(zrzut ekranu z wyników google.com)


To jest dokładnie to, czego szukasz! Wielkie dzięki!
Jeremy Powell,

11
Niestety obsługuje tylko HTTPS na standardowym porcie, nie może go używać do sprawdzania POP3S, IMAPS ani IMAP z TLS
Hubert Kario

1
I chociaż obsługuje tylko HTTPS, brakuje mu nawet wsparcia dla SNI.
Gurken Papst

12
I chociaż jest świetny do witryn publicznych, nie można go używać do witryn w sieciach odizolowanych od Internetu.
Iszi

53

sslscan to ładne małe narzędzie.

Testuje połączenia z TLS i SSL (a skrypt kompilacji może łączyć się z własną kopią OpenSSL, aby sprawdzane były również przestarzałe wersje SSL) i raportuje o pakietach szyfrów i certyfikacie serwera.

Przykładowe dane wyjściowe dla google.com(przycięte dla czytelności):

$ 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

1
yum install sslscandziała na CentOS 6.
programista

1
sudo dnf install sslscanrównież na Fedorze 22.
Zayne S Halsall,

2
brew install sslscanna OSX
Xiao

sudo apt-get install sslscanna Ubuntu (12.04 - więc wszystkie późniejsze wersje powinny być w porządku).
balu

3
Aktualizacja: Należy zauważyć, że oficjalna wersja sslscan znaleziona w repozytoriach Debian i Ubuntu (obecnie 1.8.2 z 2009 r.) Nie obsługuje TLS 1.1 i 1.2, patrz bugs.launchpad.net/ubuntu/+source/sslscan / + bug / 1372741 . Dlatego należy korzystać z wersji na GitHub, z którą powiązany jest PO.
balu

15

Ponieważ jest to świetny wątek referencyjny dla narzędzi skanujących SSL, wymienię CipherScan, który został utworzony rok temu, i mogę również zidentyfikować problemy z szyframi wymiany kluczy. https://github.com/jvehent/cipherscan

Jeśli chcesz mój rozwidlenie, które obsługuje SNI i FreeBSD, adres URL to https://github.com/oparoz/cipherscan

Jest to skrypt, który wywołuje openssl s_clienti obsługuje użycie własnego pliku binarnego OpenSSL, dzięki czemu można przetestować nadchodzące funkcje lub nowe szyfry (na przykład chacha20 + poly1305).

Pozwala także połączyć się z dowolnym portem i użyć starttlss.

Oto typowy wynik

# ./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

A oto lista opcji

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

Dane wyjściowe json są przydatne, jeśli wywołujesz to z innych skryptów.


„Konfiguracja big-SSLv3 nie jest obsługiwana, połączenie nieudane”
koder


8

Po małym googlingu znalazłem to Testowanie SSL-TLS (OWASP-CM-001) :

Nmap skaner, za pomocą opcji skanowania „-sv”, jest w stanie zidentyfikować usługi SSL. Skanery narażenia na atak oprócz przeprowadzania wykrywania usług mogą obejmować sprawdzanie słabych szyfrów (na przykład skaner Nessus ma możliwość sprawdzania usług SSL na dowolnych portach i zgłasza słabe szyfry).

a także: Foundstone SSL Digger to narzędzie do oceny siły serwerów SSL poprzez testowanie obsługiwanych szyfrów. Niektóre z tych szyfrów są znane z niepewności.



2

SSLScan jest świetny; nowe narzędzie SSLDiagnos działa w systemie Windows, lub możesz po prostu napisać skrypt za pomocą openssl s_client.



2

Jeśli chcesz uzyskać przyjemny grepowalny wynik (i obsługę sprawdzania wszystkich wersji SSL / TLS)

Zastosowanie: ./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";

Wykonujesz openssl ciphers -tls1.1a openssl ciphers -tls1.2jednak te params wydają się nie istnieć ... Jest tylko -tls1(przynajmniej na platformach próbowałem).
Marki

(Wydaje się, że istnieją dodatkowe opcje w postaci tls1_1i, tls1_2ale są one pokazane tylko w głównej wersji openssl, a nawet w 1.0.2 ....)
Marki

Zauważ, że ten skrypt prawdopodobnie nie powie ci, czy serwer obsługuje pakiety szyfrów, których OpenSSL nie obsługuje.
sampablokuper,

2

Na stronie pentesterscripting.com znajduje się ładny mały skrypt, który wykorzystuje zarówno SSLScan, jak i OpenSSL do sprawdzania:

  • SSL v2;
  • Szyfry tygodniowe garnitury;
  • MD5; i
  • Luka w renegocjacji TLS

http://www.pentesterscripting.com/discovery/ssl_tests (przez Internet Archive Wayback Machine )

Tutaj powielono w celu zabezpieczenia na przyszłość, ponieważ główna strona jest już martwa:

#!/usr/bin/env bash

# Description:
#       Script to extract the most security relevant details from a 
#       target SSL/TLS implementation by using sslscan.
# Author:  Raul Siles (raul _AT_ taddong _DOT_ com)
#          Taddong (www.taddong.com)
# Date:    2011-05-27
# Version: 1.0
#
# - Current SSL/TLS tests: 
#   SSLv2, NULL cipher, weak ciphers -key length-, strong 
#   ciphers -AES-, MD5 signed cert, SSL/TLS renegotiation
#
# Requires: 
# - sslscan
# https://sourceforge.net/projects/sslscan/
#
# Credits: Based on ssl_test.sh by Aung Khant, http://yehg.net.
# 

#
# /**************************************************************************
# *   Copyright 2011 by Taddong (Raul Siles)                                *
# *                                                                         *
# *   This program is free software; you can redistribute it and/or modify  *
# *   it under the terms of the GNU General Public License as published by  *
# *   the Free Software Foundation; either version 3 of the License, or     *
# *   (at your option) any later version.                                   *
# *                                                                         *
# *   This program is distributed in the hope that it will be useful,       *
# *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
# *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
# *   GNU General Public License for more details.                          *
# *                                                                         *
# *   You should have received a copy of the GNU General Public License     *
# *   along with this program. If not, see <http://www.gnu.org/licenses/>.  *
# *                                                                         *
# **************************************************************************/
#

VERSION=1.0

OPENSSLVERSION=$(openssl version)
SSLSCANVERSION=$(sslscan --version | grep version | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")

echo ------------------------------------------------------
echo " TLSSLed - ($VERSION) based on sslscan and openssl"
echo " by Raul Siles (www.taddong.com)"
echo " ( inspired by ssl_test.sh by Aung Khant )"
echo ------------------------------------------------------
echo + openssl version: $OPENSSLVERSION
echo + $SSLSCANVERSION
echo ------------------------------------------------------
echo

if [ $# -ne 2 ]; then 
   echo Usage: $0 IP PORT
   exit
fi

HOST=$1
PORT=$2

echo  [*] Analyzing SSL/TLS on $HOST:$PORT ...
echo 

# Run sslcan once, store the results to a log file and
# analyze that file for all the different tests:
DATE=$(date +%F_%R:%S)
TARGET=$HOST:$PORT
LOGFILE=sslscan\_$TARGET\_$DATE.log
ERRFILE=sslscan\_$TARGET\_$DATE.err

echo [*] Running sslscan on $HOST:$PORT...
sslscan $HOST:$PORT > $LOGFILE 2> $ERRFILE

echo
echo [*] Testing for SSLv2 ...
cat $LOGFILE | grep "Accepted  SSLv2"
echo
echo [*] Testing for NULL cipher ...
cat $LOGFILE | grep "NULL" | grep Accepted
echo
echo [*] Testing for weak ciphers \(based on key length\) ...
cat $LOGFILE | grep " 40 bits" | grep Accepted
echo 
cat $LOGFILE | grep " 56 bits" | grep Accepted
echo
echo [*] Testing for strong ciphers \(AES\) ...
cat $LOGFILE | grep "AES" | grep Accepted

echo 
echo [*] Testing for MD5 signed certificate ...
#cat $LOGFILE | grep -E 'MD5WithRSAEncryption|md5WithRSAEncryption'
cat $LOGFILE | grep -i 'MD5WithRSAEncryption'

echo 
echo [*] Checking preferred server ciphers ...
cat $LOGFILE | sed '/Prefered Server Cipher(s):/,/^$/!d' | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"

echo
echo [*] Testing for SSLv3/TLSv1 renegotiation vuln. \(CVE-2009-3555\) ...
#echo [*] echo R \| openssl s_client -connect $HOST:$PORT \| grep "DONE"
#
# Renegotiation details go to stderr (2>)
#
# if $OPENSSLVERSION is updated (version?) it supports RFC5746 and will print:
# Secure Renegotiation IS NOT supported
# Secure Renegotiation IS supported
#

echo R | openssl s_client -connect $HOST:$PORT | grep -E "Secure Renegotiation IS|DONE"

echo
echo [*] New files created:
ls -l $LOGFILE
if [ ! -s $ERRFILE ]; then
        # Error file is empty
        rm $ERRFILE
else
        ls -l $ERRFILE
fi

echo
echo 
echo [*] done
echo

Zastosowanie: ./ssltest.sh HOST PORT


2

Na podstawie @ indyw za odpowiedzi i sugestie, aby opublikować go jako własną odpowiedź, przytaczam moje tweaked wersję skryptu @ indyw użytkownika. Możesz podać host jako pierwszy argument, który wyświetli te same wyniki co oryginalny skrypt, ale nieco bardziej sformatowany:

#!/usr/bin/env bash
# adapted from https://superuser.com/questions/109213/how-do-i-list-the-ssl-tls-cipher-suites-a-particular-website-offers

# OpenSSL requires the port number.
# SERVER=192.168.1.1:443
SERVER=$1
if [[ -z "$SERVER" ]]; then echo "ERROR: no server specified"; exit 1; fi;

## Set up colors, if possible
if [[ $(tput colors) ]];then
  COLOR_BOLD="$(tput bold)"     # "\e[1;32m"
  COLOR_GREEN="$(tput setaf 2)" # "\e[1;32m"
  COLOR_RESET="$(tput sgr0)"    # "\e[0m"
fi


SERVER=$1:443
echo Server is ${COLOR_BOLD}"$SERVER"${COLOR_RESET}

DELAY=1
ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g')

echo Obtaining cipher list from $(openssl version).

for cipher in ${ciphers[@]}
  do
  printf "%-42s" "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 ${COLOR_BOLD}${COLOR_GREEN}YES${COLOR_RESET}
    else
      echo UNKNOWN RESPONSE
      echo $result
    fi
  fi
  sleep $DELAY
done

2

(Bezpłatna) książka kucharska OpenSSL autorstwa Ivana Risticia, który opracował narzędzie online SSL Labs odnotowane w odpowiedzi Keza , stwierdza:

Jeśli chcesz określić wszystkie pakiety obsługiwane przez dany serwer, zacznij od wywołania, openssl ciphers ALLaby uzyskać listę wszystkich pakietów obsługiwanych przez twoją wersję OpenSSL. Następnie prześlij je do serwera jeden po drugim, aby przetestować je indywidualnie. Nie sugeruję, że robisz to ręcznie; jest to sytuacja, w której mała automatyzacja przechodzi długą drogę. W rzeczywistości jest to sytuacja, w której warto rozejrzeć się za dobrym narzędziem .

Testowanie w ten sposób ma jednak wadę. Możesz testować tylko pakiety obsługiwane przez OpenSSL. ...

Żadna pojedyncza biblioteka SSL / TLS nie obsługuje wszystkich pakietów szyfrów , co utrudnia kompleksowe testowanie. W przypadku SSL Labs skorzystałem z częściowego uzgadniania w tym celu z niestandardowym klientem, który udaje, że obsługuje dowolne pakiety . W rzeczywistości nie może negocjować nawet jednego pakietu, ale sama propozycja negocjacji wystarczy, aby serwery poinformowały Cię, czy obsługują pakiet, czy nie. Nie tylko możesz przetestować wszystkie zestawy w ten sposób, ale możesz także zrobić to bardzo skutecznie.

(Mój nacisk.)

Jednym z narzędzi, o którym nie wspominałem w innych odpowiedziach, jest test SSL Stephena Bradshawa , który między innymi ma na celu porównanie „wykrytych szyfrów i protokołów ze standardami zgodności, takimi jak DSD ISM i PCI-DSS”.

Wypróbuj to lub jedno z narzędzi wymienionych w innych odpowiedziach, albo stwórz własne i rozważ zastosowanie częściowego uścisku dłoni Ristića.


1

Napisałem narzędzie, które właśnie to robi. Nazywa się tlsenum i jest dostępny w GitHub .

[ayrx@division tlsenum]$ ./tlsenum.py twitter.com 443
TLS Versions supported by server: 3.0, 1.0, 1.1, 1.2
Supported Cipher suites in order of priority:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_RC4_128_SHA
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_RC4_128_SHA
TLS_RSA_WITH_RC4_128_MD5
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_3DES_EDE_CBC_SHA

Oto przykładowe wyjście narzędzia przeciwko twitter.com.

Jest podobny do tego, co robi laboratorium SSL, ale uważam, że posiadanie narzędzia wiersza poleceń, które można zautomatyzować i przeanalizować, jest znacznie bardziej przydatne.


1

SSLyze, pierwotnie na https://github.com/iSECPartners/sslyze , jest teraz na https://github.com/nabla-c0d3/sslyze . Zostało to wspomniane w innej odpowiedzi , ale bez wielu szczegółów.

SSLyze jest oparty na Pythonie i działa w systemie Linux / Mac / Windows z wiersza poleceń. Korzysta z OpenSSL, a w systemie Windows jest dostarczany z dołączoną kopią OpenSSL.

Zawiera protokoły, zestawy szyfrów i kluczowe szczegóły, a także testy niektórych typowych luk w zabezpieczeniach. Możliwe jest włączenie lub wyłączenie określonych kontroli, aby uzyskać więcej danych lub przyspieszyć skanowanie.


0

Jedyne, co możesz zrobić, to wypróbować je wszystkie pojedynczo i sprawdzić, które z nich są akceptowane. Nie znam narzędzia do tego, choć nie powinno być trudno połączyć je razem z narzędziami skryptowymi i openssl s_client.

Podczas gdy klient reklamuje, które szyfry akceptuje, serwer po prostu wybiera jeden i używa go lub nie nawiązuje połączenia, jeśli nie znajdzie nic, co mu się podoba.


O tak ... z jakiegoś powodu myślałem, że jest na odwrót. Może znajdę wstępnie brukowane narzędzie ... :)
Jeremy Powell,

0

Wszystkie te odpowiedzi są w porządku. Jedna część odpowiedzi może wyjaśniać, dlaczego potrzebujemy narzędzia do wykrywania listy serwerów i nie pytamy bezpośrednio w TLS, czy serwer udostępnia wszystkie obsługiwane zestawy szyfrów, tak jak robi to klient TLS, gdy łączy się z serwerem.

Odpowiedź jest taka, że serwer nigdy nie wysyła listy , po prostu wybiera na liście szyfrów klienta szyfr, którego chce użyć, w ten sposób zapisywany jest protokół SSL / TLS: http://wiki.opensslfoundation.com/index.php/ SSL_and_TLS_Protocols # Cipher_Suites

Dlatego klient musi wyliczyć szyfry, aby móc znaleźć te obsługiwane przez serwer i aby wykonać co najmniej jeden nowy uzgadnianie początkowe (ClientHello) dla każdego pakietu szyfrów.


0

Szukając czegoś, co działa AUTH TLSna FTP, odkryłem to narzędzie: ssl-cipher-suite-enum

Jest to skrypt perla, który zasadniczo robi to, co robi skrypt powłoki hackajar, tylko bardziej wyrafinowany.

Oferuje także podstawową ocenę oferowanych szyfrów i protokołów. To trochę jak narzędzia SSL Labs, tylko do użytku domowego. :)

Domyślnie obsługuje tylko AUTH SSLFTP, ale proste wyszukiwanie i zamiana może to naprawić. Jako bonus twierdzi również, że obsługuje SMTP STARTTLSzi RDP.


0

TestSSLServer to rozwiązanie oparte wyłącznie na Javie. Zalety:

  • działa na bardzo niskim poziomie, tylko na zwykłych gniazdach, więc jest niezależny od możliwych niedostępnych szyfrów z JDK lub OpenSSL .

  • nie wymaga otwierania żadnych dodatkowych portów (takich jak ICMP dla ping)

  • działa z obecnymi certyfikatami klienta

Niedogodności:

  • od 2016 r. lista szyfrów może być nieaktualna (choć nie jestem ekspertem, aby to ocenić)

Moje osobiste doświadczenie: biorąc pod uwagę ciasny serwer z tylko jednym otwartym portem HTTPS (bez żadnego innego portu), wymaganymi certyfikatami klientów i aktywnym iptables, nadal był w stanie wyświetlić listę dostępnych szyfrów, podczas gdy najlepiej oceniane rozwiązania nie były (ja byłem próba małego skryptu powłoki, SSL Labs, NMap, sslscan)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.