通过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握手失败意味着客户端没有提供正确的客户端证书。 仍然是我使用的客户端证书,在浏览器中工作。

注意:当我禁用服务器上的客户端身份validation时,wget可以连接。 注意:build议使用curl,但我想避免切换。

您确定SSL客户端证书身份validation对您的服务器有效吗?

我只是testing了一下,我可以拿我的证书(PKCS12格式),将其转换为PEM格式的证书和密钥文件,并使用wget就可以了。

我可以挑起三个错误条件,这些条件都不符合你所报告的内容:

  1. 无法提供我的密钥文件:400错误的请求
  2. 提供了一个错误的密钥:EVP_DecryptFinal_ex:来自OpenSSL的不良解密
  3. 提供服务器不喜欢的有效证书:403禁止

我正在使用nginx; 你没有提到你使用的是什么,所以我不确定Apache是​​否会返回相同的响应。

我build议把你的证书和密钥,结合到PKCS12(或只是如果你的浏览器支持格式导入它作为PEM),并确保一切工作在这方面的第一。

如果你已经这样做了,也许你可以从另外一台机器上试一下,以确保你使用的OpenSSL版本不会有什么奇怪的地方。

最后,尝试在s_client模式下使用OpenSSL:

 openssl s_client -cert cert.pem -key req.pem -connect host:port -debug 

看看事情在这个层面上是否有效。 如果是这样的话,那么wget有些东西是不可靠的,你可能需要重新构build或重新安装它。 如果不是这样,debugging输出的级别可能会帮助您找出问题,而不是wget的debugging输出。

我在这个网页上学习了一个星期,最后得到了我的帮助。

我用来连接的命令是:“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

我已经成功地使用了这样的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

但是,它现在提示我input“PEM密码短语”。

如果我input密码,它的工作正常, 但有没有人知道提示的方式?

有没有可能wget连接到端口80? 这个错误非常类似于我在testing中收到的错误,当我不小心听到了HTTP和HTTP 80和443-wget试图谈论SSL并没有得到它想要的响应。

获取networking捕获并将其加载到Wireshark中。 这应该会让您更清楚地了解SSL / TLS级别失败的情况。

在0.9.8版本中,SSLv3存在问题。

尝试传递-no_ticket以openssl s_client或者-ssl2工作