我正在尝试检查哪些密码套件可以与服务器进行握手。我在帖子末尾使用脚本,他代表他调用OpenSSL,并且输出与套件名称等效于OpenSSL。例如:
$./ciphers.sh stackoverflow.com:443
stackoverflow.com:443,SSL2(),SSL3(),TLS1(ECDHE-RSA-AES256-SHA:AES256-SHA:ECDHE-RSA-AES128-SHA:AES128-SHA),TLS1.1(ECDHE-RSA-AES256-SHA:AES256-SHA:ECDHE-RSA-AES128-SHA:AES128-SHA),TLS1.2(ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:AES256-SHA256:AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:AES128-SHA256:AES128-SHA)
我不知道如何使用SSL / TLS密码套件名称来映射它们。我需要的是密码名称列表,例如
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
SSL_RSA_WITH_3DES_EDE_CBC_SHA
但我只是想不通...谢谢您的帮助和时间!
#!/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 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 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 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 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 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";
最佳答案
名称映射:OpenSSL使用其自己的一组密码套件名称,这些密码套件名称与大多数其他实现和文档使用的RFC中的名称相关但不相同。请参阅系统上ciphers
的手册页(如果是Unix,并且bash大多是在Unix系统上,尽管它可以移植到其他系统上),标题大约为“ CIPHER SUITE NAMES”。在某些系统上,您可能需要指定类似man 1ssl ciphers
的部分。或在线(已更新)https://www.openssl.org/docs/manmaster/man1/openssl-ciphers.html(如有必要,请使用右侧的链接以获取特定版本)。
要将RFC名称手动转换为OpenSSL:丢弃(前导)TLS
或SSL
和(嵌入)WITH
,并将所有_
更改为-
;如果密钥交换是普通RSA(不是[EC] DH [E] -RSA),则将其完全丢弃;在某些情况下,将DHE
交换为EDH
(仅旧版本),并始终将DH_anon
交换为ADH
或将ECDH_anon
交换为AECDH
;在大多数情况下,将3DES_EDE_CBC
更改为DES-CBC3
;将EXPORT
缩短为EXP
并将其移到开头;如果不需要消除歧义,在某些情况下会丢弃位长和CBC
。
请注意,匿名套件从未包含在提供或接受的默认列表中。在2015-03年度,出口套件从1.0.0r 1.0.1m和1.0.2a开始从默认设置中删除,并在2016-03年度中从1.0.1s和1.0.2g开始从默认状态中完全删除和删除了单个DES; 1.1.0中不是默认的3DES RC4 SEED IDEA Camellia和DSS身份验证(又名DSA)。从1.0.0版本开始默认禁用SSL2协议,并在2016-08年发布的1.1.0版本中将其完全删除; SSL3默认在1.1.0中被编译出来,但是可以添加回去(尽管您不应该使用它,也不能在较低版本中使用它,因为它被POODLE破坏了,除了RC4还有其他缺陷)。
可用性:密码套件在1.1.0以下的OpenSSL中分为三类:SSL2;适用于SSL3及更高版本的产品;以及TLS1.2的那些。 SSL2使用不同的代码方案,因此SSL2套件不能用于较新的协议,反之亦然。出于趣味,TLS1.0删除了Fortezza套件(无论如何OpenSSL都未实现),而TLS1.1删除了导出套件,但如上所述,OpenSSL仍然允许它们。另一方面,TLS1.2添加了新格式(AEAD)和新的PRF / KDF方案,并与它们一起使用了一堆仅适用于TLS1.2的新密码套件。除了单DES和IDEA之外,它还保留了TLS1.1中的所有内容,但如上所述,OpenSSL仍然允许使用。-ssl2 -ssl3 -tls1
低于1.1.0的ciphers
选项仅将您限制为与该格式兼容的套件,并且所有SSL3-up和TLS1.2套件均与-ssl3
和-tls1
兼容;再次参见手册页。正如@Andrew所指出的,没有低于1.1.0(编辑)的-tls1.1
或-tls1.2
选项,这添加了实际上仍然相同的选项-tls1_1
和-tls1_2
(下划线不是点),并且还添加了一个选项-stdname
显示标准(RFC)名称,避免了映射问题-但是使行很长,恕我直言,这是无法理解的。
PS:如果您的目标只是匹配或通过一些愚蠢地枚举密码的审核扫描,则此方法可以起作用。如果您希望确定有关服务器安全性的有用信息,那通常是在浪费时间。服务器完全不执行SSL2或SSL3(具有任何密码套件)并支持一些体面的密码套件并且不应用错误的首选项(此扫描未测试)就足够了;除此之外,与使用良好的身份验证密钥和证书链以及可能进行的装订(这是无法测试的)之类的事情相比,对密码套件的确切支持对安全性的影响要小得多。使用良好的短暂参数和随机性,这几乎是无法测试的,并且不会尝试;支持诸如5746和后备功能之类的功能,并且没有诸如Heartbleed和CCS之类的无法测试的错误;避免或减轻无法测试的压缩问题,并且通常来说这是不可测试的,并且将记录拆分作为针对BEAST的最佳实践(实际上是不可测试的);以及SSL / TLS级别以上的所有问题。
更新:以上内容是在TLS1.3于2018年发布之前编写的,并由OpenSSL 1.1.1实施。 TLS1.3使用一组全新的密码套件,它们仅指定完全不再使用HMAC的AEAD对称加密(GCM,CCM或ChaCha + Poly)和KDF哈希(KDF进行了实质性更改,不再称为PRF); 1.3密码套件没有像以前的版本那样指定密钥交换和服务器身份验证。 (这些内容现在由协议的其他部分处理。有关详细信息,请参阅RFC8446。)对于1.3套件,OpenSSL使用标准名称,以及单独的新API;请参阅参考资料。命令行ciphers
涵盖1.0-1.2和1.3 API。如上所述,从1.1.0版开始,SSL2被完全删除,包括其所有唯一的密码套件。
关于bash - 映射SSL/TLS密码套件及其等效的OpenSSL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36463429/