如何强制 OpenSSL 使用旧的加密算法?

3
我正在尝试使用OpenSSL从此Shell脚本检查APC电源分配单元上的“安全”证书,但一直收到空响应。
#!/bin/bash
host=192.168.242.27
port=443
cert=$(openssl s_client -connect "$host":"$port" 2>/dev/null | sed -n '/BEGIN CERT/,/END CERT/p')
echo "We got a cert:"
echo $cert

所以我进行了一些调试。我使用的是Mac,并且有一个MacPorts环境。使用MacPorts版本的OpenSSL连接到服务器时,什么也没有:

❱ openssl version
OpenSSL 1.0.2h  3 May 2016

❱ openssl s_client -connect 192.168.242.27:443
CONNECTED(00000003)
140735258415184:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:769:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 308 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1464972048
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

但是,使用内置版本后我得到了一个响应:

❱ /usr/bin/openssl version
OpenSSL 0.9.8zh 14 Jan 2016

❱ /usr/bin/openssl s_client -connect 192.168.242.27:443
CONNECTED(00000003)
depth=0 /C=US/ST=Default State/L=Default Locality/O=American Power Conversion Corp/OU=Internally Generated Certificate/CN=5A1320E05051
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 /C=US/ST=Default State/L=Default Locality/O=American Power Conversion Corp/OU=Internally Generated Certificate/CN=5A1320E05051
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/C=US/ST=Default State/L=Default Locality/O=American Power Conversion Corp/OU=Internally Generated Certificate/CN=5A1320E05051
   i:/C=US/ST=Default State/L=Default Locality/O=American Power Conversion Corp/OU=Internally Generated Certificate/CN=5A1320E05051
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIC1DCCAl6gAwIBAgIIWotX81/0ywkwDQYJKoZIhvcNAQEFBQAwgasxCzAJBgNV
BAYTAlVTMRYwFAYDVQQIEw1EZWZhdWx0IFN0YXRlMRkwFwYDVQQHExBEZWZhdWx0
IExvY2FsaXR5MScwJQYDVQQKEx5BbWVyaWNhbiBQb3dlciBDb252ZXJzaW9uIENv
cnAxKTAnBgNVBAsTIEludGVybmFsbHkgR2VuZXJhdGVkIENlcnRpZmljYXRlMRUw
EwYDVQQDEww1QTEzMjBFMDUwNTEwHhcNMDEwOTEzMDk1NjU2WhcNMjIwOTEzMDk1
NjU2WjCBqzELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDURlZmF1bHQgU3RhdGUxGTAX
BgNVBAcTEERlZmF1bHQgTG9jYWxpdHkxJzAlBgNVBAoTHkFtZXJpY2FuIFBvd2Vy
IENvbnZlcnNpb24gQ29ycDEpMCcGA1UECxMgSW50ZXJuYWxseSBHZW5lcmF0ZWQg
Q2VydGlmaWNhdGUxFTATBgNVBAMTDDVBMTMyMEUwNTA1MTB8MA0GCSqGSIb3DQEB
AQUAA2sAMGgCYQDch9OnR65LipagZvVj5VACX2UIzjtq/4/EjRID34r7+GABci2P
Gw1+UOKG1fc/AeUQdOrYKwpC4qzMmGij/H1mhEbvdc3FYtq4l8/f/Ou+mLW32SfJ
d/yMuL0gtq98oRsCAwEAAaNEMEIwEQYKKwYBBAGXVQMBBQQDAwEAMB0GA1UdDgQW
BBQUcKO5XStaWDQVNrzCuYli5ezggTAOBgNVHQ8BAf8EBAMCBaAwDQYJKoZIhvcN
AQEFBQADYQB7XFmN6oBMT7sCRyHqoujjb/yCRvol19YBcIvzuMJiPOtzLrDOOqBc
QrROWPKq1RwPQnLzQ9bnbJ7dcMukrpmLrAA4T9SK0en+puTGtMqEsxFdX7mZr0ZG
wRCP+fFjCGU=
-----END CERTIFICATE-----
subject=/C=US/ST=Default State/L=Default Locality/O=American Power Conversion Corp/OU=Internally Generated Certificate/CN=5A1320E05051
issuer=/C=US/ST=Default State/L=Default Locality/O=American Power Conversion Corp/OU=Internally Generated Certificate/CN=5A1320E05051
---
No client certificate CA names sent
---
SSL handshake has read 848 bytes and written 280 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 768 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-MD5
    Session-ID: E07867E677700F3E7F69FFCC96B4A158
    Session-ID-ctx: 
    Master-Key: 16CB13EF51575C010EB50D37C353A276C108B6673D5FEFEA7B196F84C7ECD858AC00A3137C5AAB9758C50ED35B92BC8B
    Key-Arg   : None
    Start Time: 1464972023
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---

(是的,那是一种RC4-MD5加密方式在一台两年前的硬件设备上使用;但我不建议任何人购买这些东西。)
在生产环境中,我希望能够从一台Linux服务器上执行此操作,该服务器只能访问OpenSSL 1.0.2。我尝试使用各种参数来禁用和启用各种组合的SSL和TLS,但没有成功。那么,有没有办法让现代版本的OpenSSL与使用弱密码的设备进行通信呢?

1
Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参阅帮助中心中的我可以在这里问什么样的问题。也许超级用户苹果Stack Exchange更适合提问。另请参阅我应该在哪里发布Dev Ops相关的问题? - jww
@jww 是的,这是设备默认的证书;我正在尝试提取所有证书,以便知道哪些需要用我们的CA的证书替换。而且,由于浏览器停止接受768位密钥,因此这些东西的管理仅限于SSH。现在它们都需要固件更新,以便能够处理1024位密钥和一个额外的密码。对于一个在2016年销售的设备来说,这是非常糟糕的安全性。 - miken32
回答您的问题,您可以使用旧协议和密码,例如 openssl s_client -connect 192.168.242.27:443 -ssl3 -cipher 'AES-SHA'。如果您正在使用带有SNI的TLS 1.0及以上版本,则使用 openssl s_client -connect 192.168.242.27:443 -tls1 -servername -cipher 'HIGH:!aNULL:!RC4:!MD5'。另请参见 s_client man page - jww
“这对于一个在2016年销售的设备来说安全性非常差劲...” - 哈哈... 所有Verizon/Actiontec路由器都使用相同的公共/私有密钥对,你的设备可能也存在同样的问题。在devttys0的GitHub littleblackbox上有它们的注册表。 - jww
"AES-SHA"?不,这个东西只支持56位的DES,或者128位的RC4-MD5和RC4-SHA。仅限于以上这些算法。所以很遗憾,如果没有重新编译的话是无法运行的。 - miken32
显示剩余6条评论
1个回答

6

这是关于编程的,因为你可能需要从源代码构建自己的工具。

参见 OpenSSL 1.0.2g 更新日志中的此处

  • 在默认版本中禁用 SSLv3 及以上的弱密码。没有配置“enable-weak-ssl-ciphers” 的版本将不提供任何“EXPORT”或“LOW”强度的密码。 [Viktor Dukhovni]

  • 禁用默认版本、默认谈判以及弱密码的 SSLv2。SSLv2 默认在构建时禁用。没有配置“enable-ssl2”的版本将不支持 SSLv2。


就此而言,目前没有计划允许这些标志进入MacPorts。谢谢。 - miken32
这不是编程。引用的变更日志说明您可以通过重新构建软件来启用此功能:“未配置[以执行此操作]的构建将不提供任何[...]“LOW”强度密码。” - jpaugh
@jpaugh有一个tag for 'build'。而Wikipedia disagrees:“计算机编程是设计和构建可执行计算机程序以完成特定的计算结果或执行特定任务的过程。” - Andrew Henle
1
你是对的,编程中的构建确实是其中的一部分。但这不仅限于编程,而且通常需要较少的技术知识。我的观点只是,“高级用户”不应该害怕构建应用程序。(我正在查看几个SE网站以寻找解决方案,并误解了您添加该语句的原因。现在我惊讶地发现,这个问题实际上是在[SO]上,而不是[ SU]。但是...无论如何。) - jpaugh
值得一提的是,一个经过精心打磨的代码发布版本,配备良好的文档和自动化构建流程,可以使构建变得相当简单。话虽如此,一个不太完善的构建流程需要具备其他编程技能的不同程度。 - jpaugh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接