为了缓解“贵宾犬”漏洞,我想在我的服务器(在本例中为TLS,而不是HTTPS)中禁用SSLv3支持。如何使用openssl s_client验证我是否已完成此操作?

#1 楼

OpenSSL s_client
要检查是否已禁用SSLv3支持,请运行以下
openssl s_client -connect example.com:443 -ssl3

,它应生成类似
3073927320:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1258:SSL alert number 40
3073927320:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:596:

的内容,这意味着服务器上已禁用SSLv3 。否则,连接将成功建立。
Nmap
或者,您可以使用nmap扫描服务器以获取受支持的版本:
# nmap --script ssl-enum-ciphers example.com
Starting Nmap 6.47 ( http://nmap.org ) at 2014-10-15 03:19 PDT
Nmap scan report for example.com (203.0.113.100)
Host is up (0.090s latency).
rDNS record for 203.0.113.100: edge.example.com
Not shown: 997 filtered ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https
| ssl-enum-ciphers: 
|   **SSLv3: No supported ciphers found**
|   TLSv1.0: 


评论


openssl命令有效;但是,我无法使nmap脚本正常工作。

–罗杰·利普斯科姆
2014年10月15日上午10:55

啊。非默认端口。每个stackoverflow.com/a/17175548/8446使用--script + ssl-enum-ciphers。

–罗杰·利普斯科姆
14-10-15在11:11

您的nmap命令的输出是什么?

– P4cK3tHuNt3R
14-10-15在11:37

gist.github.com/rlipscombe/eb941f08f24016fe5cd0

–罗杰·利普斯科姆
14-10-15在12:02



工作正常;我解决了我使用的是非标准端口,因此必须在脚本名称前加上'+'才能强制其运行。

–罗杰·利普斯科姆
2014年10月19日在14:24

#2 楼

附带说明一下,您可以将nmap与ssl-enum-ciphers脚本一起使用,如下所示

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


您将得到这样的响应。

PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   SSLv3: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - strong
|       TLS_RSA_WITH_RC4_128_MD5 - strong
|       TLS_RSA_WITH_RC4_128_SHA - strong
|     compressors: 
|       NULL
|   TLSv1.0: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_RSA_WITH_RC4_128_MD5 - strong
|       TLS_RSA_WITH_RC4_128_SHA - strong
|     compressors: 
|       NULL
|   TLSv1.1: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong
|     compressors: 
|       NULL
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - strong
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - strong
|     compressors: 
|       NULL
|_  least strength: strong


如您所见,它列出了所有受支持的ssl / tls版本以及密码套件

评论


这是获取远程端点上可用密码列表的最快方法。与往常一样,nmap规则! ;)

– stamster
20年6月16日在20:44

#3 楼

如果仅禁用了SSLv3,则还可以强制openssl s_client仅使用TLS:

openssl s_client -connect exmaple.com:443 -tls1


评论


对于TLS 1.0及更高版本,您也应该使用-servername选项。加入SNI。

–user29925
2015年6月5日在3:48

这不会验证ssl3是否已禁用,它只是告诉您使用TLS 1

–马特奥
16 Mar 9 '16 at 13:49

#4 楼

我创建此测试是为了确保SSLv3协议的可用性。可能有一种更好的方法来搜索一个字符串,该字符串也表明正在使用CBC密码,但是大多数人似乎只是想知道SSLv3是否完全可用。

需要注意的几件事:


是为Mac OS X上的bash而编写的,因此不能肯定地说它可以在任何地方都可以使用
,因为Mac对于这些核心实用程序很奇怪,因此使用gtimeout vs. timeout
allexternal.txt是每行一个主机名或IP的文件

脚本:

for ip in `awk '{print }' < allexternal.txt`; do
    if gtimeout 30 openssl s_client -connect $ip:443 -ssl3 | grep -q 'Protocol  : SSLv3' ; then
        echo $ip SSLv3 detected >> sslv3output;
    else
        echo $ip SSLv3 NOT detected >> sslv3output;
    fi;
done


评论


对于格式的道歉,不确定如何将重音符号显示为文字,而不是将其变成代码块。

–theterribletrivium
2014-10-15 22:44

感谢您的分享,但是我建议您使用echo'QUIT',这样就不必安装gtimeout。第二行应显示为...如果echo'QUIT'| openssl s_client -connect $ ip:443 -ssl3 | grep -q'协议:SSLv3';然后

– Alex Lauerman
2014年11月11日在2:44



使用“协议:SSLv3”似乎也令人怀疑。在此页面上:security.stackexchange.com/a/71459/51963,“ Cipher:0000”可能是更好的搜索字符串。

– thesquaregroot
16年7月13日在16:40

#5 楼

值得注意的是,现在必须在编译时启用OpenSSL中的-ssl3选项。如果您在预编译的二进制文件上运行,则该选项可能不可用。请参见以下问题:https://github.com/openssl/openssl/issues/6801

替代方法是testssl.sh。这将检查协议,密码和选定的漏洞:https://github.com/drwetter/testssl.sh