如何检索特定网站提供的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一起使用。我知道我可以通过对话的十六进制转储进行grep操作,但是我希望有一些更优雅的方法。

我更喜欢在Linux上执行此操作,但是Windows(或其他操作系统)可以。这个问题是由我对PCI进行的安全性测试和常规渗透性测试所激发的。

更新:

GregS指出,下面是SSL服务器从以下服务器的密码套件中选择的:客户。因此,似乎我需要一次测试所有密码套件。我想我可以一起破解一些东西,但是有没有更简单,更适合未来使用的方法(例如新密码)呢?

评论

也许gnutls-cli?

更改标题后,这个问题实际上并不是在要求软件录音。投票重新打开。

@ fixer1234如果它使您更快乐,我已删除了所有出现的“工具”一词。核心问题是询问如何完成一项特定任务。这只是个小词,与开放式的“软件列表”类型的问题相去甚远。

@Bob:我很高兴。 :-)投票重新打开。

#1 楼

我写了一个bash脚本来测试密码套件。它从OpenSSL获取受支持的密码套件的列表,并尝试使用每个套件进行连接。如果握手成功,则打印YES。如果握手失败,则会显示NO,然后显示OpenSSL错误文本。

#!/usr/bin/env bash

# OpenSSL requires the port number.
SERVER=
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


编辑:增加灵活性,因为主机和端口作为脚本的参数提供了

评论


openssl 1.0需要更改:if [[“ $ result” =〜“ Cipher:”]];而不是if [[“ $ result” =〜“ Cipher is”]];然后我还要测试SSL2和安全的重新协商:echo -n测试ssl2 ... result = $(echo -n | openssl s_client -ssl2 -connect $ SERVER 2>&1)如果[[“ $ result” =〜“ Cipher: “]];然后支持echo。不安全!否则,不支持回显,请确定fi echo -n正在测试SSL安全重新协商... echo -n“” | openssl s_client -connect $ SERVER 2>&1 | grep“安全重新协商”

–休伯特·卡里奥(Hubert Kario)
2011年7月20日在7:40



还有另一个使用sslscan和openssl的非常复杂的shell脚本:TLSSLed

–罗伯特
2012年10月2日,9:21

我在下面列出了另一个只需要OpenSSL的脚本,称为CipherScan

–奥利维尔-interfaSys
2014-09-16 11:36



请注意,此脚本可能不会告诉您服务器是否支持OpenSSL不支持的密码套件。

–user11574
16-09-19在14:33

@Robert对于TLSSLed的建议非常棒。它已更新至1.3,并具有更多功能。我一直在进行安全性测试,必须说给我留下深刻的印象。

–约翰·艾尼(John Yeary)
18年1月24日在21:50



#2 楼


带有ssl-enum-ciphers的Nmap


没有更好或更快的方法从网络服务中获取可用密码的列表。另外,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


评论


是否可以在具有STARTTLS的IMAP上使用此脚本? SMTP上的STARTTLS似乎可以运行,但是在IMAP上,该脚本甚至似乎都无法运行。

–吉尔
2014年7月11日9:17



一个警告是较旧的脚本(可能包含在您的发行版/软件包中)以字母顺序列出密码,而不是以服务器(或客户端)的首选顺序列出密码。请参阅@slim的上述评论

– Clint Pachl
16年1月11日在23:52



自撰写此答案以来的两年中,Nmap增加了对FTP,NNTP,IMAP,LDAP,POP3,PostgreSQL,SMTP,XMPP,VNC和MS SQL上的STARTTLS的支持,以及除列出受支持密码之外的许多其他改进。 。

–bonsaiviking
16年9月19日在15:20

请注意。这可能会导致编写不良的应用程序崩溃。在继续使用此工具之前,请先阅读本文档nmap.org/book/legal-issues.html

– rakpan
19 Mar 8 '19在14:25



警告:此脚本似乎已过时,不支持TLSv1.3!

– Yan Foto
20 Feb 10'在16:35

#3 楼


是否有工具可以测试特定网站上提供的SSL / TLS密码套件



是的,您可以使用在线工具在SSL实验室的网站上查询公共SSL服务器数据库。

以下是提供的信息摘要:



(屏幕快照来自google.com的结果)

评论


这正是我想要的!非常感谢!

–杰里米·鲍威尔(Jeremy Powell)
2010-2-25在18:48

不幸的是,它仅在标准端口上支持HTTPS,无法使用它来检查POP3S,IMAPS或带TLS的IMAP

–休伯特·卡里奥(Hubert Kario)
2011年7月20日在8:35

尽管它仅支持HTTPS,但它甚至不支持SNI。

–古肯·帕斯特(Gurken Papst)
2012年6月8日在21:21

尽管它非常适合面向公众的站点,但是您不能将其用于与Internet隔离的网络上的站点。

– Iszi
2015年5月21日在13:30

注意,它需要一个FQDN。它不会测试IP地址。看来您必须为此注册一个帐户...

– FreeText
20 Mar 5 '20 at 17:04

#4 楼

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


评论


yum install sslscan可在CentOS 6上使用。

–编码员
15年8月18日在19:23



sudo dnf也在Fedora 22上安装sslscan。

–Zayne S Halsall
15年9月28日在9:45

在OSX上brew install sslscan

–萧
16年4月18日在6:31

更新:应该注意的是,在Debian和Ubuntu存储库中找到的sslscan正式版本(当前为2009年的1.8.2版)不支持TLS v1.1和1.2,请参见bugs.launchpad.net/ubuntu/+source/sslscan / +错误/ 1372741。因此,应该使用OP链接到的GitHub版本。

– Balu
16年6月12日在22:58

截至2020年3月,Ubuntu存储库中的sslscan版本为1.11.5,其中包括对TLS v1.1的支持。和1.2,但不是TLS v1.3,因为它仍在使用OpenSSL 1.0.2n(2017年12月7日)。我相信OpenSSL在v1.1.1中添加了TLS 1.3支持。

– FreeText
20 Mar 5 '20 at 17:06

#5 楼

由于这是SSL扫描工具的绝佳参考线程,因此,我将列出一年前创建的CipherScan,它还可以标识密钥交换密码的问题。
https://github.com/jvehent/cipherscan

如果您想要我的支持SNI和FreeBSD的fork,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输出,则很有用。

评论


“不支持big-SSLv3配置,连接失败”

–编码员
15年8月18日在19:30

#6 楼

https://github.com/iSECPartners/sslyze

这是基于Python的,可从命令行在Linux / Mac / Windows中运行。

#7 楼

经过一番谷歌搜索之后,我发现此SSL-TLS测试(OWASP-CM-001):


nmap扫描程序通过“ –sV”扫描选项能够识别SSL。服务。漏洞扫描程序除了执行服务发现外,还可能包括针对弱密码的检查(例如,Nessus扫描程序具有检查任意端口上的SSL服务的能力,并将报告弱密码)。


同时:Foundstone SSL Digger是一种通过测试支持的密码来评估SSL服务器强度的工具。其中一些密码是不安全的。

#8 楼

我正在使用大多数SSL测试testssl.sh(请参阅https://testssl.sh/ devel版本@ https://github.com/drwetter/testssl.sh。它测试漏洞,密码,协议等。

#9 楼

此答案总结了给定的最佳答案,并指出了为什么要选择一个替代品(或不选择!)。


要找到最佳解决方案,我们应该首先回答“我们为什么要枚举所有支持的密码?”。这里的重点是安全性,即找出服务器是否易受攻击。下一个要回答的问题是输出是否应该是机器可读的,例如是否可以在脚本中进一步使用。

1。 testssl.sh


CLI(Bash)
TLSv1.3
检查已知漏洞
自包含(不需要安装)
支持370个密码(从3.1版本开始),包括已弃用的密码(新的openSSL版本不包括)
产生机器可读的结果(CSV和JSON)
(并行)批处理


testssl.sh相对于以下替代产品的最重要优点可能是使用了一组专门针对漏洞测试而设计的二进制文件(请在此处阅读开发人员的说明)。

2。 cipherscan



CLI(python)
没有TLSv1.3
自包含
有限密码套件(硬编码)
产生机器可读的结果(JSON)
快速

3。 nmap ssl-enum-ciphers



CLI(nmap脚本)
没有TLSv1.3
自包含
受限密码套件(硬编码)
检查已知漏洞
没有机器可读的结果


有关可用工具的详尽概述,请参见sslLabs评估工具。

#10 楼

SSLScan很棒;一个新的工具SSLDiagnos适用于Windows,或者您可以只使用openssl s_client编写脚本。

#11 楼

如果您想要一个不错的可重复输出(并支持检查所有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 :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 :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 :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 :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 :443 2>&1)
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then
  TLS12="${TLS12}${cipher}:"
fi
done
TLS12=$(echo "${TLS12})" | sed -e 's/:)/)/g')

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


评论


您正在执行openssl密码-tls1.1和openssl密码-tls1.2,但是这些参数似乎不存在...仅存在-tls1(至少在我尝试过的平台上)。

– Marki
16 Jun 15'在9:19



(似乎还有tls1_1和tls1_2形式的其他选项,但它们仅显示在opensl的​​主版本中,甚至没有显示在1.0.2中。)

– Marki
16年6月15日在9:30



请注意,此脚本可能不会告诉您服务器是否支持OpenSSL不支持的密码套件。

–user11574
16-09-19在14:31

OpenSSL 1.1.1确实包括TLS 1.1、1.2和1.3支持。参数为-tls1_1,-tls1_2和-tls1_3。但是,例如-tls1_2返回的结果比您期望的要多。从命令行尝试:openssl ciphers -v -tls1_2

– FreeText
20 Mar 5 '20 at 17:11



#12 楼

pentesterscripting.com上有一个不错的小脚本,可以同时使用SSLScan和OpenSSL来检查:


SSL v2;
每周密码套件;
MD5;和
TLS重新协商漏洞

http://www.pentesterscripting.com/discovery/ssl_tests(通过Internet存档Wayback机)

在此处重复以用于将来的验证现在主站点已死:

#!/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: q4312078q IP PORT
   exit
fi

HOST=
PORT=

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主机端口

#13 楼

基于@indiv的答案和建议将其发布为自己的答案,我提供了@indiv脚本的调整版本。您可以提供一个主机作为第一个参数,它将输出与原始脚本相同的结果,但格式要稍微多一些:

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


#14 楼

IvanRistić(免费开发)的OpenSSL Cookbook(开发了Kez的答案中提到的SSL Labs在线工具)指出:


如果要确定特定服务器支持的所有套件, ,
首先调用openssl ciphers ALL以获得您的OpenSSL版本支持的所有套件的列表。然后将它们逐个提交到服务器
分别进行测试。我不建议您手动执行
;在这种情况下,一点点自动化就会大步前进。实际上,在这种情况下,寻找一个
好的工具可能是适当的。

用这种方法测试
是一个缺点。您只能测试OpenSSL支持的套件。 ...

没有一个
SSL / TLS库支持所有密码套件,这使得
全面测试变得困难。对于SSL实验室,我为此目的使用了
部分握手功能,并且使用自定义的客户端
假装支持任意套件。实际上,它甚至无法协商单个套件,但是建议进行协商就足以使服务器
告诉您它们是否支持套件。您不仅可以通过这种方式测试所有套件,而且还可以非常高效地进行测试。


(我的重点。)

我未曾在其他答案中提到的工具是Stephen Bradshaw的SSLTest,它的主要目的是将“检测到的密码和协议与DSD ISM和PCI-DSS等合规性标准进行比较。”

因此,请尝试使用此工具或其他答案中提到的一种工具,或者自己构建工具并考虑使用Ristić的部分握手方法。

#15 楼

Nmap的ssl-enum-ciphers脚本可以列出受支持的密码和SSL / TLS版本,以及受支持的压缩器。

评论


您的答案早些,但是Clint Pachl的答案更全面地解释了ssl-enum-cipher。

–user11574
16-09-19在14:28



#16 楼

我写了一个工具来做到这一点。它称为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类似实验室确实可以,但是我发现拥有一个可以自动化和解析的命令行工具要有用得多。

#17 楼

SSLyze最初位于https://github.com/iSECPartners/sslyze,而现在位于https://github.com/nabla-c0d3/sslyze。在另一个答案中提到了它,但没有太多细节。

SSLyze基于Python,可从命令行在Linux / Mac / Windows上运行。它使用OpenSSL,并且在Windows上随附OpenSSL的捆绑副本。

列出了协议,密码套件和密钥详细信息,以及一些常见漏洞的测试。可以启用或禁用特定检查,以获取更多数据或加快扫描速度。

#18 楼

您唯一可以做的就是一次全部尝试,然后看看哪些被接受。我不知道有什么工具可以做到这一点,尽管应该不难从脚本工具和openssl s_client中将其拼凑起来。

虽然客户端公布它将接受的密码套件,但服务器只是选择了一个并使用它,或者如果找不到它喜欢的连接,则连接失败。

评论


哦,是的。。。由于某种原因,我认为这是另一回事。也许我可以找到一个预先准备好的工具... :)

–杰里米·鲍威尔(Jeremy Powell)
2010-2-16在16:50

#19 楼

所有这些答案都很好。答案的一部分可以解释为什么我们需要一种工具来发现服务器列表,而不直接在TLS中询问服务器提供了所有受支持的密码套件,就像TLS客户端在连接到服务器时所做的一样。

答案是服务器永远不会发送列表,它只是在客户端密码列表中选择要使用的密码,这就是SSL / TLS协议的编写方式:http://wiki.opensslfoundation.com/index。 php / SSL_and_TLS_Protocols#Cipher_Suites

这就是为什么客户端必须枚举密码才能找到服务器支持的密码,并且为此必须为每个密码套件至少进行一个新的开始握手(ClientHello)。 />

#20 楼

在寻找可以在FTP上执行AUTH TLS的操作时,我发现了此工具:ssl-cipher-suite-enum

这是一个perl脚本,基本上可以完成hackajar的shell脚本的工作,只是更加复杂。 >
还提供了对提供的密码和协议的基本评估。有点像SSL Labs工具,只供家庭使用。 :)

默认情况下,它仅在FTP上支持AUTH SSL,但是简单的搜索和替换即可解决此问题。另外,它还声称支持STARTTLS和RDP的SMTP。

#21 楼

TestSSLServer是纯基于Java的解决方案。优点:


它仅在普通套接字上工作,非常低级,因此它独立于JDK或OpenSSL可能的不可用密码。
它不需要任何其他端口(例如用于ping的ICMP)将被打开
它与存在的客户证书一起使用



截至2016年,密码列表可能过时了(尽管我不是专家来判断)

我的个人经验:假设服务器是封闭的,只有一个HTTPS端口打开(没有其他端口),则需要客户端证书和iptables处于活动状态时,它仍然能够列出可用的密码,而投票最多的解决方案却没有(我正在尝试使用小型Shell脚本,SSL Labs,NMap,sslscan)