如何强制OpenSSL使用旧密码

How to force OpenSSL to use old ciphers

提问人:miken32 提问时间:6/4/2016 最后编辑:miken32 更新时间:6/4/2016 访问量:15632

问:

我正在尝试从此shell脚本中使用OpenSSL检查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)
---

(是的,这是 2 年前硬件上的 RC4-MD5 密码;不,我不建议任何人购买这些东西之一。

在生产环境中,我希望能够从 Linux 服务器执行此操作,在那里我只能访问 OpenSSL 1.0.2。我尝试过各种参数来禁用和启用SSL和TLS的各种组合,但没有运气。那么,有没有办法让现代版本的OpenSSL与具有弱加密的设备进行通信?openssl s_client

bash ssl openssl macports

评论

0赞 miken32 6/4/2016
我知道这可能被认为是题外话,但我是作为 Bash shell 脚本的一部分这样做的;所以编程,对吧?
1赞 jww 6/4/2016
Stack Overflow 是一个编程和开发问题的网站。这个问题似乎偏离了主题,因为它与编程或开发无关。请参阅帮助中心中的哪些主题可以咨询。也许 Super UserApple Stack Exchange 会是一个更好的提问地点。另请参阅在哪里发布有关 Dev Ops 的问题?
0赞 jww 6/4/2016
与此相关,您有一个格式不正确的自签名证书:/C=US/ST=Default State/L=Default Locality/O=American Power Conversion Corp/OU=Internally Generated Certificate/CN=5A1320E05051。没有作为主机名的主题备用名称(使用类似 )。几乎每个用户代理都会拒绝它。OpenSSL 不会拒绝它,因为 OpenSSL 1.0.2 及更早版本执行主机名匹配。OpenSSL 1.1.0 将执行主机名匹配,因此请准备好回答接下来的所有 devops 问题。192.168.242.27pbpaste | openssl x509 -text -noout
0赞 miken32 6/4/2016
@jww是的,这是设备附带的默认设置;我正在尝试提取所有证书,以便我知道哪些证书需要替换为我们 CA 中的证书。事实上,这些东西的管理仅限于 SSH,因为浏览器不再接受 768 位密钥。现在,它们都需要固件更新,因此它们可以处理一个 1024 位密钥和一个额外的密码。对于2016年销售的设备来说,安全性非常差。
0赞 jww 6/4/2016
要回答您的直接问题,您可以使用旧的协议和密码,例如 .如果您将 TLS 1.0 及更高版本与 SNI 一起使用,则 .另请参见手册页s_clientopenssl s_client -connect 192.168.242.27:443 -ssl3 -cipher 'AES-SHA'openssl s_client -connect 192.168.242.27:443 -tls1 -servername -cipher 'HIGH:!aNULL:!RC4:!MD5'

答:

6赞 Andrew Henle 6/4/2016 #1

这是编程,因为你可能必须从源代码构建自己的。

从 OpenSSL 1.0.2g 更新日志中可以看出:

  • 在 SSLv3 及更高版本的默认 OpenSSL 版本中禁用弱密码。 未配置“enable-weak-ssl-ciphers”的构建将不会 提供任何“EXPORT”或“LOW”强度密码。 [维克多·杜霍夫尼]

  • 禁用 SSLv2 默认构建、默认协商和弱密码。 SSLv2的 默认情况下,在构建时禁用。未配置的构建 “enable-ssl2”将不支持 SSLv2。

评论

0赞 miken32 6/4/2016
就是这样,谢谢。作为记录,也没有计划允许这些标志进入MacPort
0赞 jpaugh 11/25/2021
这不是编程。引用的更新日志指出,您可以通过重新构建软件来启用此功能:“未配置 [这样做] 的构建不会提供任何 [...]LOW“强度密码。
0赞 Andrew Henle 11/25/2021
@jpaugh 有一个“build”标签维基百科不同意:“计算机编程是设计和构建可执行计算机程序以完成特定计算结果或执行特定任务的过程。
1赞 jpaugh 12/1/2021
你说得对,建筑是编程的一部分。但是,它并不仅限于编程,而且通常需要的技术知识要少一些。我的观点只是,“高级用户”不应该被吓跑,不敢构建应用程序。 (我正在寻找几个 SE 网站寻求解决方案,并误解了您添加该声明的原因。我很惊讶地注意到,现在,这个问题实际上是在 Stack Overflow 上,而不是超级用户。但。。。随便。
0赞 jpaugh 12/1/2021
FWIW 是一个精心打磨的代码版本,具有良好的文档和自动化的构建过程,可以使构建变得相当简单。话虽如此,不太完善的构建过程需要不同程度的其他编程技能。