通过 wget 使用客户端证书

通过 wget 使用客户端证书

我无法让 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 一起使用了。

我可以引发三种错误情况,但没有一种符合您所报告的情况:

  1. 无法提供我的密钥文件:400 Bad Request
  2. 提供错误密钥:EVP_DecryptFinal_ex:来自 OpenSSL 的错误解密
  3. 提供服务器不喜欢的有效证书: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 级别出现的问题。

相关内容