Bagaimana cara mendaftar suite SSL / TLS cipher yang ditawarkan situs web tertentu?


261

Bagaimana saya bisa mengambil daftar cipher SSL / TLS suites yang ditawarkan situs web tertentu?

Saya sudah mencoba openssl, tetapi jika Anda memeriksa hasilnya:

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

itu hanya menunjukkan bahwa cipher suite adalah sesuatu dengan AES256-SHA. Aku tahu aku bisa menerobos keluar dari percakapan hex hex, tapi aku berharap untuk sesuatu yang sedikit lebih elegan.

Saya lebih suka melakukan ini di Linux, tetapi Windows (atau lainnya) akan baik-baik saja. Pertanyaan ini dimotivasi oleh pengujian keamanan yang saya lakukan untuk PCI dan pengujian penetrasi umum.

Memperbarui:

GregS menunjukkan di bawah ini bahwa server SSL mengambil dari cipher suites klien. Jadi sepertinya saya perlu menguji semua suite sandi satu per satu. Saya pikir saya bisa meretas sesuatu bersama-sama, tetapi apakah ada cara yang lebih sederhana, lebih bukti di masa depan (misalnya cipher baru) untuk melakukan ini?


Mungkin gnutls-cli?
grawity

Setelah perubahan judul, pertanyaan ini sebenarnya tidak meminta rec perangkat lunak. Voting untuk dibuka kembali.
Bob

@ fixer1234 Jika itu membuat Anda lebih bahagia, saya telah menghapus kemunculan kata "alat". Pertanyaan intinya adalah bagaimana cara menyelesaikan tugas tertentu; itu adalah pengulangan ulang dan jauh dari pertanyaan jenis "daftar perangkat lunak" yang lebih terbuka.
Bob

@ Bob: Saya gembira sekali. :-) Voting untuk dibuka kembali.
fixer1234

Jawaban:


232

Saya menulis skrip bash untuk menguji suite sandi. Itu mendapat daftar suite sandi yang didukung dari OpenSSL dan mencoba untuk terhubung menggunakan masing-masing. Jika jabat tangan berhasil, itu akan dicetak YES. Jika jabat tangan tidak berhasil, itu dicetak NO, diikuti oleh teks kesalahan 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

Berikut contoh output yang menunjukkan 3 cipher yang tidak didukung, dan 1 cipher yang didukung:

[@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: Tambahkan fleksibilitas karena host dan port disediakan sebagai parameter pada skrip


7
openssl 1.0 perlu perubahan: if [[ "$result" =~ "Cipher :" ]] ; thenalih-alih if [[ "$result" =~ "Cipher is " ]] ; thensaya juga menguji SSL2 dan mengamankan negosiasi ulang: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
Ada lagi, skrip shell sangat canggih yang tersedia yang menggunakan sslscan dan openssl: TLSSLed
Robert

2
Saya telah mencantumkan di bawah ini skrip lain yang hanya membutuhkan OpenSSL yang disebut CipherScan
Olivier - interfaSys

1
Perhatikan bahwa skrip ini mungkin tidak akan memberi tahu Anda jika server mendukung cipher suites yang tidak didukung OpenSSL.
sampablokuper

2
Saran dari @Robert untuk TLSSLed sangat fantastis. Ini telah diperbarui ke 1.3 dan memiliki lebih banyak fungsi. Saya telah menggunakan pengujian keamanan dan harus mengatakan bahwa saya terkesan.
John Yeary

162

Nmap dengan ssl-enum-ciphers

Tidak ada cara yang lebih baik atau lebih cepat untuk mendapatkan daftar sandi yang tersedia dari layanan jaringan. Plus, nmap akan memberikan peringkat kekuatan yang kuat, lemah, atau tidak dikenal untuk setiap cipher yang tersedia.

Pertama, unduh skrip nmap ssl-enum-ciphers.nse ( penjelasan di sini ). Kemudian dari direktori yang sama dengan skrip, jalankan nmap sebagai berikut:

Daftar cipher yang didukung oleh server HTTP

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

Daftar cipher yang didukung oleh server IMAP

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

Berikut cuplikan output dari server 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

2
Apakah ada cara untuk menggunakan skrip ini di IMAP dengan STARTTLS? STARTTLS pada SMTP tampaknya berfungsi, tetapi pada IMAP skrip tersebut tampaknya tidak berjalan.
Giel

Beberapa hal: Anda mungkin menjalankan skrip di distro nmap Anda, bukan yang Anda unduh. Periksa dengan mengganti nama Anda. Kemudian periksa "portrule" yang dalam beberapa versi memeriksa nomor port yang umum digunakan. Ganti denganportrule = function() \n return true \n end
langsing

... dan perlu beberapa peretasan untuk bekerja dengan IMAP STARTTLS, FTPS AUTH TLSdll, tetapi itu mungkin.
langsing

1
Satu peringatan adalah bahwa skrip yang lebih lama, yang mungkin termasuk dalam distro / paket Anda, daftar cipher dalam urutan abjad, bukan server (atau klien) pesanan yang disukai. Lihat komentar di atas dari @slim
Clint Pachl

3
Dalam 2 tahun sejak jawaban ini ditulis, Nmap telah menambahkan dukungan untuk STARTTLS melalui FTP, NNTP, IMAP, LDAP, POP3, PostgreSQL, SMTP, XMPP, VNC, dan MS SQL, serta banyak perbaikan lainnya di luar sekadar daftar cipher yang didukung .
bonsaiviking

104

Apakah ada alat yang dapat menguji cipher SSL / TLS suites yang ditawarkan situs web tertentu?

Ya, Anda bisa menggunakan alat online di situs web Lab SSL untuk meminta Database Server SSL Publik.

Berikut cuplikan informasi yang diberikannya:

teks alternatif

(tangkapan layar dari hasil google.com)


Ini persis apa yang saya cari! Terima kasih banyak!
Jeremy Powell

11
Sayangnya itu hanya mendukung HTTPS pada port standar, tidak dapat menggunakannya untuk memeriksa POP3S, IMAPS atau IMAP dengan TLS
Hubert Kario

1
Dan sementara itu hanya mendukung HTTPS, bahkan tidak memiliki dukungan untuk SNI.
Gurken Papst

12
Dan meskipun bagus untuk situs yang menghadap publik, Anda tidak dapat menggunakannya untuk situs di jaringan yang terisolasi dari Internet.
Iszi

53

sslscan adalah utilitas kecil yang bagus.

Ia menguji koneksi dengan TLS dan SSL (dan skrip build dapat menautkan dengan salinan OpenSSL sendiri sehingga versi SSL yang usang diperiksa juga) dan melaporkan tentang suite dan sertifikat sandi server.

Contoh output untuk google.com(dipangkas agar mudah dibaca):

$ 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 sslscanbekerja pada CentOS 6.
seorang pembuat kode

1
sudo dnf install sslscanpada Fedora 22 juga.
Zayne S Halsall

2
brew install sslscanpada OSX
Xiao

sudo apt-get install sslscandi Ubuntu (12,04 - jadi semua versi yang lebih baru harus baik-baik saja).
balu

3
Pembaruan: Perlu dicatat bahwa versi resmi sslscan yang ditemukan di repositori Debian dan Ubuntu (saat ini 1.8.2 dari 2009) tidak mendukung TLS v1.1 dan 1.2, lihat bugs.launchpad.net/ubuntu/+source/sslscan / + bug / 1372741 . Karena itu seseorang harus menggunakan versi di GitHub yang terhubung dengan OP.
balu

15

Karena ini adalah utas referensi hebat untuk alat pemindaian SSL, saya akan mencantumkan CipherScan yang dibuat setahun lalu dan juga dapat mengidentifikasi masalah dengan sandi penukar kunci. https://github.com/jvehent/cipherscan

Jika Anda menginginkan garpu yang mendukung SNI dan FreeBSD, URL-nya adalah https://github.com/oparoz/cipherscan

Ini adalah skrip yang memanggil openssl s_clientdan mendukung menggunakan biner OpenSSL Anda sendiri sehingga Anda dapat menguji fitur yang akan datang atau cipher baru (chacha20 + poly1305 per contoh).

Ini juga memungkinkan Anda terhubung ke port apa pun yang Anda inginkan dan menggunakan starttlss.

Berikut ini adalah output khas

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

Dan berikut adalah daftar opsi

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

Output json berguna jika Anda memanggil ini dari skrip lain.


"config besar-SSLv3 tidak didukung, koneksi gagal"
seorang coder


8

Setelah sedikit googling saya menemukan Pengujian ini untuk SSL-TLS (OWASP-CM-001) :

The nmap scanner, melalui “sV” pilihan scan, mampu mengidentifikasi layanan SSL. Pemindai Kerentanan, selain melakukan penemuan layanan, dapat mencakup pemeriksaan terhadap cipher yang lemah (misalnya, pemindai Nessus memiliki kemampuan memeriksa layanan SSL pada port yang berubah-ubah, dan akan melaporkan cipher yang lemah).

dan juga: Foundstone SSL Digger adalah alat untuk menilai kekuatan server SSL dengan menguji cipher yang didukung. Beberapa cipher ini diketahui tidak aman.



2

SSLScan hebat; alat baru SSLDiagnos berfungsi untuk Windows, atau Anda bisa menulis skrip menggunakan openssl s_client.



2

Jika Anda ingin keluaran yang bagus dan dapat diterima (dan dukungan untuk memeriksa semua versi SSL / TLS)

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

Anda berkinerja openssl ciphers -tls1.1dan openssl ciphers -tls1.2bagaimanapun param itu tampaknya tidak ada ... Hanya ada -tls1(setidaknya pada platform yang saya coba).
Marki

(Tampaknya ada opsi tambahan dalam bentuk tls1_1dan tls1_2tetapi mereka hanya ditampilkan pada versi master openssl dan bahkan tidak di 1.0.2 ....)
Marki

Perhatikan bahwa skrip ini mungkin tidak akan memberi tahu Anda jika server mendukung cipher suites yang tidak didukung OpenSSL.
sampablokuper

2

Ada skrip kecil yang bagus di pentesterscripting.com untuk memanfaatkan SSLScan dan OpenSSL untuk memeriksa:

  • SSL v2;
  • Setelan sandi minggu;
  • MD5; dan
  • Kerentanan Renegosiasi TLS

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

Digandakan di sini untuk futureproofing karena situs utama sekarang mati:

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

Penggunaan: ./ssltest.sh HOST PORT


2

Berdasarkan jawaban dan saran @ indiv untuk mempostingnya sebagai jawaban sendiri, saya memberikan skrip @ indiv versi tweak saya. Anda dapat memberikan host sebagai argumen pertama, dan itu akan menampilkan hasil yang sama seperti skrip asli, tetapi sedikit lebih terformat:

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

OpenSSL Cookbook (gratis) oleh Ivan Ristic, yang mengembangkan alat online SSL Labs yang tercantum dalam jawaban Kez , menyatakan:

Jika Anda ingin menentukan semua suite yang didukung oleh server tertentu, mulailah dengan meminta openssl ciphers ALLuntuk mendapatkan daftar semua suite yang didukung oleh versi OpenSSL Anda. Kemudian kirimkan ke server satu per satu untuk mengujinya secara individual. Saya tidak menyarankan Anda melakukan ini secara manual; ini adalah situasi di mana sedikit otomatisasi berjalan jauh. Bahkan, ini adalah situasi di mana mencari-cari alat yang bagus mungkin tepat .

Namun, ada kelemahan untuk menguji dengan cara ini. Anda hanya dapat menguji suite yang didukung OpenSSL. ...

Tidak ada perpustakaan SSL / TLS tunggal yang mendukung semua suite sandi , dan itu membuat pengujian komprehensif menjadi sulit. Untuk SSL Labs, saya terpaksa menggunakan jabat tangan parsial untuk tujuan ini, dengan klien khusus yang berpura-pura mendukung suite sewenang-wenang . Ini sebenarnya tidak dapat dinegosiasikan bahkan satu suite, tetapi hanya mengusulkan untuk bernegosiasi sudah cukup bagi server untuk memberi tahu Anda apakah mereka mendukung suite atau tidak. Anda tidak hanya dapat menguji semua suite dengan cara ini, tetapi Anda juga dapat melakukannya dengan sangat efisien.

(Penekanan saya.)

Satu alat yang belum saya lihat disebutkan dalam jawaban lain adalah SSLTest Stephen Bradshaw , yang, antara lain, dimaksudkan untuk membandingkan "sandi dan protokol yang terdeteksi dengan standar kepatuhan seperti DSD ISM dan PCI-DSS."

Jadi, coba ini atau salah satu alat yang disebutkan dalam jawaban lain, atau bangun sendiri dan pertimbangkan untuk menggunakan pendekatan jabat tangan parsial Ristic.


1

Saya menulis alat yang melakukan ini. Ini disebut tlsenum dan tersedia di 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

Berikut ini adalah contoh keluaran alat terhadap twitter.com.

Ini mirip dengan apa yang dilakukan Lab SSL tetapi saya menemukan bahwa memiliki alat baris perintah yang Anda dapat mengotomatiskan dan menguraikan jauh lebih berguna.


1

SSLyze, awalnya di https://github.com/iSECPartners/sslyze , sekarang di https://github.com/nabla-c0d3/sslyze . Itu disebutkan dalam jawaban lain , tetapi tanpa banyak detail.

SSLyze berbasiskan Python, dan bekerja di Linux / Mac / Windows dari baris perintah. Ini menggunakan OpenSSL, dan pada Windows, ia datang dengan salinan OpenSSL yang dibundel.

Daftar protokol, suite sandi, dan detail kunci, ditambah tes untuk beberapa kerentanan umum. Dimungkinkan untuk mengaktifkan atau menonaktifkan pemeriksaan tertentu, untuk mendapatkan lebih banyak data atau mempercepat pemindaian.


0

Satu-satunya hal yang dapat Anda lakukan adalah mencoba semuanya, satu per satu, dan lihat mana yang diterima. Saya tidak mengetahui alat untuk melakukan ini, meskipun seharusnya tidak sulit untuk bersama-sama dari alat skrip dan openssl s_client.

Sementara klien mengiklankan ciphersuites yang akan diterima, server hanya mengambil satu dan menggunakannya atau gagal koneksi jika tidak menemukan apa pun yang disukainya.


Oh ya ... untuk beberapa alasan saya berpikir itu sebaliknya. Mungkin saya dapat menemukan alat yang sudah dirakit sebelumnya ... :)
Jeremy Powell

0

Semua jawaban itu baik-baik saja. Salah satu bagian dari jawabannya dapat menjelaskan mengapa kita memerlukan alat untuk menemukan daftar server dan tidak bertanya langsung di TLS bahwa server memberikan semua suite sandi yang didukungnya seperti yang dilakukan klien TLS ketika terhubung ke server.

Jawabannya adalah bahwa server tidak pernah mengirim daftar , hanya pilih di daftar klien cipher cipher yang ingin digunakan, ini adalah cara protokol SSL / TLS ditulis: http://wiki.opensslfoundation.com/index.php/ SSL_and_TLS_Protocols # Cipher_Suites

Itu sebabnya klien harus menghitung sandi untuk dapat menemukan yang didukung oleh server dan untuk itu harus melakukan setidaknya satu jabat tangan awal baru (ClientHello) untuk setiap rangkaian sandi.


0

Sambil mencari sesuatu yang tidak AUTH TLSpada FTP, saya menemukan alat ini: ssl-cipher-suite-enum

Ini adalah skrip perl yang pada dasarnya melakukan apa yang dilakukan skrip shell hackajar, hanya saja lebih canggih.

Ini juga menawarkan evaluasi dasar dari cipher dan protokol yang ditawarkan. Ini agak mirip alat SSL Labs, hanya untuk digunakan di rumah. :)

Secara default, ini hanya mendukung AUTH SSLpada FTP, tetapi pencarian dan penggantian yang sederhana dapat memperbaikinya. Sebagai bonus, ia juga mengklaim mendukung SMTP dengan STARTTLSdan RDP.


0

TestSSLServer adalah solusi berbasis Java murni. Keuntungan:

  • ini bekerja sangat rendah, hanya pada Sockets polos, jadi itu terlepas dari kemungkinan tidak tersedia cipher dari JDK atau OpenSSL .

  • itu tidak memerlukan port tambahan (seperti ICMP untuk ping) untuk dibuka

  • itu berfungsi dengan sertifikat klien hadir

Kekurangan:

  • pada 2016, daftar sandi mungkin sudah ketinggalan zaman (meskipun saya bukan ahli di sini untuk menilai ini)

Pengalaman pribadi saya: diberi server yang sangat ketat dengan hanya satu port HTTPS terbuka (tidak ada port lain), sertifikat klien diperlukan dan iptables aktif, masih dapat membuat daftar cipher yang tersedia, sementara solusi terpilih tidak. mencoba skrip shell kecil, SSL Labs, NMap, sslscan)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.