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ć?
gnutls-cli
?Odpowiedzi:
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 wydrukowaneNO
, a następnie tekst błędu OpenSSL.Oto przykładowe dane wyjściowe przedstawiające 3 nieobsługiwane szyfry i 1 obsługiwany szyfr:
EDYCJA: Dodaj elastyczność, ponieważ host i port są dostarczane jako parametr do skryptu
źródło
if [[ "$result" =~ "Cipher :" ]] ; then
zamiastif [[ "$result" =~ "Cipher is " ]] ; then
testować 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'
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
Lista szyfrów obsługiwanych przez serwer IMAP
Oto fragment wyniku z serwera IMO Dovecot:
źródło
portrule = function() \n return true \n end
AUTH TLS
itp., ale jest to możliwe.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:
(zrzut ekranu z wyników google.com)
źródło
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):źródło
yum install sslscan
działa na CentOS 6.sudo dnf install sslscan
również na Fedorze 22.brew install sslscan
na OSXsudo apt-get install sslscan
na Ubuntu (12.04 - więc wszystkie późniejsze wersje powinny być w porządku).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_client
i 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
A oto lista opcji
Dane wyjściowe json są przydatne, jeśli wywołujesz to z innych skryptów.
źródło
https://github.com/iSECPartners/sslyze
Ten jest oparty na Pythonie, działa w systemie Linux / Mac / Windows z wiersza poleceń.
źródło
Po małym googlingu znalazłem to Testowanie SSL-TLS (OWASP-CM-001) :
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.
źródło
Używam do większości testów SSL testysl.sh (patrz https://testssl.sh / devel version @ https://github.com/drwetter/testssl.sh . Testuje podatności, szyfry, protokoły itp.
źródło
SSLScan jest świetny; nowe narzędzie SSLDiagnos działa w systemie Windows, lub możesz po prostu napisać skrypt za pomocą openssl s_client.
źródło
Nmap jest ssl-enum-szyfry skrypt może notować obsługiwane szyfry i wersje SSL / TLS, jak i obsługiwanych sprężarek.
źródło
ssl-enum-ciphers
wiele bardziej kompleksowo.Jeśli chcesz uzyskać przyjemny grepowalny wynik (i obsługę sprawdzania wszystkich wersji SSL / TLS)
Zastosowanie: ./script.sh www.url.com
źródło
openssl ciphers -tls1.1
aopenssl ciphers -tls1.2
jednak te params wydają się nie istnieć ... Jest tylko-tls1
(przynajmniej na platformach próbowałem).tls1_1
i,tls1_2
ale są one pokazane tylko w głównej wersji openssl, a nawet w 1.0.2 ....)Na stronie pentesterscripting.com znajduje się ładny mały skrypt, który wykorzystuje zarówno SSLScan, jak i OpenSSL do sprawdzania:
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:
Zastosowanie: ./ssltest.sh HOST PORT
źródło
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:
źródło
(Bezpłatna) książka kucharska OpenSSL autorstwa Ivana Risticia, który opracował narzędzie online SSL Labs odnotowane w odpowiedzi Keza , stwierdza:
(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.
źródło
Napisałem narzędzie, które właśnie to robi. Nazywa się tlsenum i jest dostępny w GitHub .
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.
źródło
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.
źródło
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.
źródło
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.
źródło
Szukając czegoś, co działa
AUTH TLS
na FTP, odkryłem to narzędzie: ssl-cipher-suite-enumJest 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 SSL
FTP, ale proste wyszukiwanie i zamiana może to naprawić. Jako bonus twierdzi również, że obsługuje SMTPSTARTTLS
zi RDP.źródło
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:
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)
źródło