映射SSL / TLS密码套件及其OpenSSL等价物

时间:2016-04-06 22:27:29

标签: bash ssl openssl

我正在尝试检查哪些密码套件可以与服务器进行握手。我在帖子的末尾使用脚本,代表他调用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";

1 个答案:

答案 0 :(得分:1)

名称映射:OpenSSL使用自己的一组密码套件名称,这些名称与大多数其他实施和文档使用的RFC中的名称相关但不相同。请参阅“CIPHER SUITE NAMES”标题下的系统上ciphers的手册页(如果类似于Unix,bash主要是类Unix系统,尽管它可以移植到其他系统)。在某些系统上,您可能需要指定类似man 1ssl ciphers的部分。或者在https://www.openssl.org/docs/man1.0.2/apps/ciphers.html在线(使用右边的链接之前其他版本,如果适用,虽然1.0.1之前是正式不支持的,目前404为我)。

要手动将RFC名称转换为OpenSSL:放弃(领先)TLSSSL和(嵌入式)WITH并将所有_更改为- ;密钥交换是普通的RSA(不是[EC] DH [E] -RSA)完全丢弃它;在某些情况下,将DHE交换为EDH(仅限旧版本)并始终将DH_anon交换为ADHECDH_anon转换为AECDH;将大多数案例中的3DES_EDE_CBC更改为DES-CBC3;将EXPORT缩短为EXP并将其移至开头;如果不需要消除歧义,则在某些情况下丢弃比特长度和CBC

请注意,匿名套件从未包含在提供或接受的默认列表中;导出套件从默认情况下移除,从2015.03开始的1.0.0r 1.0.1m和1.0.2a,并从2016-03-03开始全部删除并从默认情况下删除单DES从1.0.1s和1.0.2g开始; 3DES RC4 SEED IDEA Camellia和DSS认证(又名DSA)在1.1.0中不是默认的;自1.0.0起默认禁用SSL2协议,并在2016-08发布的1.1.0中完全删除; SSL3在1.1.0中默认编译出来但可以加回(虽然你不应该使用它,也不应该在低版本上使用它,因为除了RC4有其他缺陷之外它被POODLE破坏了。)

可用性:密码套件在OpenSSL中属于三类,低于1.1.0: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仍然允许使用它。

{1.1}以下的-ssl2 -ssl3 -tls1选项仅限于与格式兼容的套件,并且所有SSL3-up和TLS1.2套件都兼容ciphers-ssl3;再次看到手册页。正如@Andrew所指出的,-tls1-tls1.1下面没有选项1.1.0(编辑),这会增加选项-tls1.2-tls1_1(下划线而不是点),这些选项实际上仍然存在相同,并添加一个选项-tls1_2来显示标准(RFC)名称,避免映射问题 - 但使线条很长,恕我直言,这是不可能的。

PS:如果你的目标只是匹配或传递一些愚蠢地枚举密码的审计扫描,这种方法可行。如果您希望确定有关服务器的安全性的有用信息,那么这主要是浪费时间。服务器不能完全使用SSL2或SSL3(使用任何密码套件)并且支持某些体面的密码套件并且不应用错误的偏好(此扫描不测试);除了使用良好的auth密钥和证书链以及可能是装订之类的东西之外,确切地说支持哪些密码组件的安全性要小得多;使用几乎不可能测试的良好的短暂参数和随机性,这不会尝试;支持5746和后备功能,没有像Heartbleed和CCS这样的错误,而这些错误没有测试;避免或减轻压缩问题,这些问题不能测试,一般情况下可能无法测试,并且使用记录拆分作为对抗BEAST的最佳实践,而这种做法实际上是不可测试的;以及SSL / TLS级别以上的各种问题。