242

Как я могу получить список наборов шифров SSL/TLS, предлагаемых конкретным веб-сайтом?

Я пробовал openssl, но если вы посмотрите на вывод:

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

это просто показывает, что набор шифров - это что-то с AES256-SHA. Я знаю, что могу пролистать шестнадцатеричный дамп разговора, но я надеялся на что-то более элегантное.

Я бы предпочел сделать это на Linux, но Windows (или другой) будет в порядке. Этот вопрос мотивирован тестированием безопасности, которое я проводил для PCI, и общим тестированием на проникновение.

Обновить:

Ниже GregS указывает, что сервер SSL выбирает из комплектов шифров клиента. Так что, похоже, мне нужно будет протестировать все наборы шифров по одному. Я думаю, что я могу взломать что-то вместе, но есть ли более простой, более перспективный (например, новые шифры) способ сделать это?

20 ответов20

213

Я написал скрипт bash для тестирования комплектов шифров. Он получает список поддерживаемых наборов шифров из OpenSSL и пытается подключиться, используя каждый из них. Если рукопожатие прошло успешно, оно печатает YES . Если рукопожатие не было успешным, оно печатает NO , а затем текст ошибки 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

Вот пример выходных данных, показывающих 3 неподдерживаемых шифра и 1 поддерживаемый шифр:

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

РЕДАКТИРОВАТЬ: добавить гибкость, так как хост и порт предоставляются в качестве параметра для сценария

144

Nmap с ssl-enum-шифрами

Нет лучшего или более быстрого способа получить список доступных шифров из сетевого сервиса. Кроме того, nmap предоставит оценку прочности сильного, слабого или неизвестного для каждого доступного шифра.

Сначала загрузите скрипт ssl-enum-ciphers.nse nmap (объяснение здесь). Затем из того же каталога, что и скрипт, запустите nmap следующим образом:

Список шифров, поддерживаемых HTTP-сервером

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

Список шифров, поддерживаемых сервером IMAP

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

Вот фрагмент вывода с сервера Dovecot IMAP:

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
98

Есть ли инструмент, который может проверить то, что наборы шифров SSL/TLS предлагает определенный веб-сайт?

Да, вы можете использовать онлайн-инструмент на веб-сайте SSL Labs для запроса базы данных общедоступного сервера SSL.

Вот фрагмент информации, которую он предоставляет:

альтернативный текст

(скриншот с результатов google.com)

50

sslscan - это небольшая полезная утилита.

Он проверяет соединение с использованием TLS и SSL (а сценарий сборки может связываться с собственной копией OpenSSL, что также проверяет устаревшие версии SSL) и сообщает о наборах шифров и сертификате сервера.

Пример вывода для google.com (обрезано для удобства чтения):

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

Поскольку это отличный справочный поток для инструментов сканирования SSL, я перечислю CipherScan, который был создан год назад, и который также может выявить проблемы с шифрами обмена ключами. https://github.com/jvehent/cipherscan

Если вам нужен мой форк, который поддерживает SNI и FreeBSD, URL-адрес https://github.com/oparoz/cipherscan

Это скрипт, который вызывает openssl s_client и поддерживает использование вашего собственного двоичного файла OpenSSL, чтобы вы могли тестировать будущие функции или новые шифры (chacha20+poly1305 для каждого примера).

Он также позволяет вам подключаться к любому порту и использовать starttlss.

Вот типичный вывод

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

Вывод json полезен, если вы вызываете это из других скриптов.

12

https://github.com/iSECPartners/sslyze

Этот основан на Python, работает в Linux/Mac/Windows из командной строки.

8

После небольшого поиска я нашел это Тестирование для SSL-TLS (OWASP-CM-001):

Сканер nmap с помощью опции сканирования «–sV» может идентифицировать службы SSL. Сканеры уязвимостей, в дополнение к выполнению обнаружения служб, могут включать проверки на слабые шифры (например, сканер Nessus имеет возможность проверять службы SSL на произвольных портах и сообщать о слабых шифрах).

а также: Foundstone SSL Digger - это инструмент для оценки надежности серверов SSL путем тестирования поддерживаемых шифров. Известно, что некоторые из этих шифров небезопасны.

4

Я использую для большинства тестов SSL testssl.sh (см. Https://testssl.sh / devel version @ https://github.com/drwetter/testssl.sh. Он проверяет уязвимости, шифры, протоколы и т.д.

2

Сценарий Nmap ssl-enum-ciphers может перечислять поддерживаемые шифры и версии SSL/TLS, а также поддерживаемые компрессоры.

2

Основываясь на ответе @ индивидуума и предложении опубликовать его как собственный ответ, я предоставляю свою измененную версию сценария @ индивидуума. Вы можете предоставить хост в качестве первого аргумента, и он будет выводить те же результаты, что и исходный скрипт, но немного более отформатированный:

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

На pentesterscripting.com есть небольшой симпатичный скрипт, который использует SSLScan и OpenSSL для проверки:

  • SSL v2;
  • Недельные шифры;
  • MD5; а также
  • Уязвимость пересмотра TLS

http://www.pentesterscripting.com/discovery/ssl_tests (через интернет-архив Wayback Machine)

Дублирован здесь для защиты будущего, так как основной сайт уже мертв:

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

Использование: ./ssltest.sh ХОЗЯЙСТВЕННЫЙ ПОРТ

2

Если вам нужен хороший вывод grepable (и поддержка проверки всех версий SSL/TLS)

Использование: ./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

SSLScan великолепен; новый инструмент SSLDiagnos работает для Windows, или вы можете просто написать скрипт, используя openssl s_client.

1

Я написал инструмент, который делает именно это. Он называется tlsenum и доступен на 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

Вот пример вывода инструмента против twitter.com .

Это похоже на то, что делает SSL Lab, но я считаю, что наличие инструмента командной строки, который вы можете автоматизировать и анализировать, гораздо полезнее.

1

(Бесплатно) Поваренная книга OpenSSL Ивана Ристича, который разработал онлайн-инструмент SSL Labs, отмеченный в ответе Кеза, утверждает:

Если вы хотите определить все наборы, поддерживаемые конкретным сервером, начните с вызова openssl ciphers ALL чтобы получить список всех наборов, поддерживаемых вашей версией OpenSSL. Затем отправьте их на сервер один за другим, чтобы проверить их по отдельности. Я не предлагаю вам делать это вручную; Это ситуация, в которой небольшая автоматизация проходит долгий путь. Фактически, это ситуация, в которой поиск подходящего инструмента может быть уместным.

Однако у тестирования такого способа есть недостаток. Вы можете протестировать только те пакеты, которые поддерживает OpenSSL. ...

Ни одна библиотека SSL/TLS не поддерживает все комплекты шифров, что затрудняет всестороннее тестирование. Для лабораторий SSL я прибегнул к частичному рукопожатию для этой цели с пользовательским клиентом, который притворяется, что поддерживает произвольные комплекты. На самом деле он не может договориться даже об одном наборе, но просто предложить согласование достаточно, чтобы серверы сказали вам, поддерживают ли они пакет или нет. Вы можете не только протестировать все комплекты таким образом, но и сделать это очень эффективно.

(Мой акцент.)

Одним из инструментов, о котором я не упоминал в других ответах, является SSLTest Стивена Брэдшоу, который, среди прочего, предназначен для сравнения «обнаруженных шифров и протоколов с такими стандартами соответствия, как DSD ISM и PCI-DSS».

Итак, попробуйте этот или один из инструментов, упомянутых в других ответах, или создайте свой собственный и подумайте об использовании подхода Ристича по частичному рукопожатию.

0

TestSSLServer - это решение, основанное исключительно на Java. Преимущества:

  • он работает очень низкоуровнево, просто на простых сокетах, поэтому он не зависит от возможных недоступных шифров из JDK или OpenSSL.

  • не требует открытия дополнительных портов (например, ICMP для ping)

  • работает с сертификатами клиента

Недостатки:

  • с 2016 года список шифров может устареть (хотя я здесь не эксперт, чтобы судить об этом)

Мой личный опыт: учитывая тесный сервер с открытым только одним HTTPS-портом (без другого порта), требуются клиентские сертификаты и активные iptables, он все еще мог перечислять доступные шифры, в то время как решения с наибольшим количеством голосов не были (я был пробовать небольшой скрипт, SSL Labs, NMap, sslscan)

0

SSLyze, первоначально по адресу https://github.com/iSECPartners/sslyze, теперь находится по адресу https://github.com/nabla-c0d3/sslyze. Это было упомянуто в другом ответе, но без особых подробностей.

SSLyze основан на Python и работает на Linux/Mac/Windows из командной строки. Он использует OpenSSL, а в Windows он поставляется в комплекте с копией OpenSSL.

Перечисляет протоколы, комплекты шифров и ключевые детали, а также тесты для некоторых распространенных уязвимостей. Можно включить или отключить определенные проверки, чтобы получить больше данных или ускорить сканирование.

0

Ища что-то, что делает AUTH TLS на FTP, я обнаружил этот инструмент: ssl-cipher-suite-enum

Это perl-скрипт, который в основном делает то, что делает скрипт оболочки hackajar, только более сложный.

Он также предлагает базовую оценку предлагаемых шифров и протоколов. Это похоже на инструменты SSL Labs, только для домашнего использования. :)

По умолчанию он поддерживает только AUTH SSL на FTP, но простой поиск и замена могут это исправить. В качестве бонуса он также утверждает, что поддерживает SMTP с STARTTLS и RDP.

0

Все эти ответы в порядке. Одна часть ответа может объяснить, почему нам нужен инструмент для обнаружения списка серверов и не спрашивать непосредственно в TLS, что сервер предоставляет все свои поддерживаемые наборы шифров, как это делает клиент TLS при подключении к серверу.

Ответ заключается в том, что сервер никогда не отправляет список, он просто выбирает в списке клиентских шифров тот шифр, который он хочет использовать, так пишется протокол SSL/TLS: http://wiki.opensslfoundation.com/index.php/SSL_and_TLS_Protocols # Cipher_Suites

Вот почему клиент должен перечислить шифры, чтобы иметь возможность найти те, которые поддерживаются сервером, и для этого сделать по крайней мере одно новое начальное рукопожатие (ClientHello) для каждого набора шифров.

0

Единственное, что вы можете сделать, это попробовать их все по одному и посмотреть, какие из них приняты. Я не знаю инструмент для этого, хотя не должно быть сложно собрать его вместе из инструментов сценариев и openssl s_client .

В то время как клиент объявляет, какие наборы шифров он примет, сервер просто выбирает один и использует его или прерывает соединение, если он не находит ничего, что ему нравится.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .