我无法让 wget 使用客户端证书。文档提到了使用 --certificate 标志。
证书标志的用途很明确,我将其设置为使用客户端证书的 PEM 版本。
但是当我连接时出现以下错误:
HTTP request sent, awaiting response... Read error (error:14094410:SSL routines:
SSL3_READ_BYTES:sslv3 alert handshake failure; error:140940E5:SSL routines:SSL3_
READ_BYTES:ssl handshake failure) in headers.
Giving up.
ssl 握手失败意味着客户端未提供正确的客户端证书。我使用的客户端证书仍然可以在浏览器中使用。
注意:当我在服务器上禁用客户端身份验证时,wget 可以连接。注意:建议使用 curl,但我想避免切换。
答案1
我研究了这个问题一个星期,最终得到了这个页面的帮助。
我用来连接的命令是:
wget --ca-cert=/etc/ssl/certs/winhostname.pem --certificate=/etc/ssl/private/linuxhost.pem \
--private-key=/etc/ssl/private/linuxhost.key https://winhostname.home.net:8443/winhosturl.asmx
答案2
您确定 SSL 客户端证书认证对您的服务器有效吗?
我刚刚测试过,我可以将我的证书(PKCS12 格式)转换为 PEM 格式的证书和密钥文件,然后就可以与 wget 一起使用了。
我可以引发三种错误情况,但没有一种符合您所报告的情况:
- 无法提供我的密钥文件:400 Bad Request
- 提供错误密钥:EVP_DecryptFinal_ex:来自 OpenSSL 的错误解密
- 提供服务器不喜欢的有效证书:403 禁止
我正在使用 nginx;您没有提到您正在使用什么,所以我不确定 Apache 是否会返回相同的响应。
我建议您获取证书和密钥,将其组合成 PKCS12(或者如果您的浏览器支持该格式,则将其导入为 PEM),并确保一切正常。
如果您已经这样做了,也许您可以从另一台机器上尝试,以确保它不是您所使用的 OpenSSL 版本的问题。
最后,尝试在 s_client 模式下使用 OpenSSL:
openssl s_client -cert cert.pem -key req.pem -connect host:port -debug
看看在这个级别上一切是否正常。如果正常,那么 wget 就出了问题,你可能需要重建或重新安装它。如果不行,调试输出的级别可能比 wget 的调试输出更能帮助你查明问题所在。
答案3
我已经成功使用 wget 如下:
"C:\program files\GnuWin32\bin\wget" --no-check-certificate --certificate=C:\Users\Alex\xxx.pem --private-key=C:\Users\Alex\xxx.pem --input-file=retain.url --output-document=retain.xml
注意--private-key option
.retain.url 有https://bla.bla.bla
但是,它现在提示我“输入 PEM 密码:”。
如果我输入密码,一切正常,但有人知道绕过这个提示的方法吗?
答案4
获取网络捕获并将其加载到 Wireshark 中。这应该可以让您更清楚地了解 SSL/TLS 级别出现的问题。