【发布时间】:2015-10-13 20:17:42
【问题描述】:
我正在尝试通过 php 的 stream_socket_client() 命令联系一个 url,该命令失败,没有错误代码或 msg。这是否使用 openssl、curl 或其他东西?该站点使用 https 并且可以在 Web 浏览器中正常工作。
当我直接调用 openssl 时,它会连接,但对我的证书链似乎不满意。
root@drupal7 drupal7/includes# openssl s_client -connect test.cgps.org:443
CONNECTED(00000003)
Verify return code: 21 (unable to verify the first certificate)
与卷曲相同
curl https://test.cgps.org/?q=/admin/config/search/clean-urls/check
curl: (60) SSL certificate problem: unable to get local issuer certificate
所以我认为我需要将中间证书安装到 Linux 中,我通过将 Apache 使用的相同中间证书放入 /usr/local/share/ca-certificates 并运行 update-ca-certificates 来做到这一点。
root@drupal7 drupal7/includes# update-ca-certificates
Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....done.
仍然没有运气......
【问题讨论】:
-
"这个是用 openssl、curl 还是别的什么?" ——完全不同的东西,不仅仅是一点点不同;非常不一样。你在问,“这种食物是苹果、梨还是奶酪?”当答案是,你正试图吃一根撬棍。您不使用套接字流来下载网页,而是使用它来建立双向 TCP 连接,如果您很聪明,您可以使用它来获取 Web 内容,就像您可以使用撬棍一样从树上拔苹果和梨,或者敲开奶酪轮。
-
好的,但是 stream_socket_client 是否会因为同样的原因而失败,对证书不满意?有什么方法可以进一步解决 stream_socket_client 故障吗?
-
stream_socket_client()在会话层运行,证书直到应用层才开始重要,所以不,绝对没有理由证明证书很重要。最有可能的是,Web 服务器等待对 TLS 握手的响应导致连接超时,这意味着它成功连接,成功接收数据包,并且连接在 5 秒后成功关闭,因此从这一点来看没有错误stream_socket_client()的视图。 -
而且,为了让这一点更明显......如果你想下载 HTTPS 内容,
stream_socket_client()对于你的目的来说太低了。在开始接近所需位置之前,您必须在套接字流之上编写自己的 TLS 客户端,加上自己的 HTTP 客户端。使用卷曲。找出证书或授权链出了什么问题。 -
@Ghedipunk
stream_socket_client('tls://example.com:443', ...)工作得很好。然后,您只需像未加密一样读取和写入数据。不需要你自己的 TLS 客户端?!