【发布时间】:2023-09-15 08:52:01
【问题描述】:
设置/环境:
在我们的 PHP 应用程序中,我们有时需要从 PHP 向其他服务器发出 HTTPS 请求。有问题的设置如下:
- 我们正在使用 PHP 流包装器来执行 HTTP 请求(使用 Guzzle HTTP)。我们这样做是因为流包装器支持使用 Windows 证书存储进行证书验证。
- 服务器在 Windows 上运行。
- 我们对 HTTPS 请求使用代理。
- 防火墙配置为允许
- 访问我们正在向其发出请求的服务器。
- 访问与所用证书相关的所有证书吊销列表。
我们的问题:
有时,我们的 HTTPS 请求会出乎意料地失败,并出现证书验证错误。这个问题一直存在,直到有人打开到服务器的远程桌面会话并请求我们尝试在服务器 Internet Explorer 中查询的相同 URL。之后,我们的 PHP 应用程序就可以按照它应该的方式处理它的请求了。
问题:
这里有什么问题?我们可以做些什么来进一步分析这一点?
【问题讨论】:
-
你有什么样的证书验证错误?
-
只有这条消息:
PHP Warning: fsockopen(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed -
根 CA 和所有中间 CA(可能是代理的 CA)是否已导入根存储?你能提供
print_r(openssl_get_cert_locations());的PHP版本和输出吗? -
所有的CA都是导入的(证书由域管理),
openssl_get_cert_locations()中列出的任何路径都没有证书,这是正确的。流包装器函数使用 Windows 证书存储来获取所需的证书,其中包含所有必要的证书,并且运行 PHP 的用户拥有访问它们的所有必要权限(至少我们是这样的)。
标签: php windows https ssl-certificate guzzle