【发布时间】:2016-04-06 22:27:28
【问题描述】:
我正在尝试检查哪些密码套件可以与服务器握手。我在帖子末尾使用脚本,代表他调用 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";
【问题讨论】:
-
你得到什么输出?您可能还希望根据每个调用使用
-no_ssl2或-no_tls1_1禁用每个opensslinvocation 中未使用的所有协议。并尝试为每次调用发出一些调试数据,例如有问题的密码。 -
您运行的是哪个版本的 OpenSSL?对于 OpenSSL 1.0.2.f,我不认为
openssl ciphers具有除-ssl2、-ssl3和-tls1选项之外的任何选项。没有为ciphers列出-tls1.1或-tls1.2选项。 -
openssl 和 RFC 密码名称之间的转换可以在 testssl.sh/openssl-rfc.mappping.html 找到。
-
@AndrewHenle 在
s_client中指定单个协议,如-tls1已经禁用所有其他协议;-no_选项仅在您想保留默认的“自动协商”功能(现在严重错误命名的 SSLv23_method)但对其进行部分限制时才需要。 -
@dave_thompson_085 但是限制“自动协商”功能似乎正是需要的,因为可以为多个 SSL/TLS 版本实现任意密码套件,但发布的脚本看起来正在测试是否服务器在特定 SSL/TLS 级别上支持正在测试的密码套件。