file_get_contents():SSL 操作失败,代码为 1,无法启用加密

新手上路,请多包涵

我一直在尝试从我在我们的服务器上创建的 PHP 页面访问这个特定的 REST 服务。我将问题缩小到这两行。所以我的 PHP 页面如下所示:

 <?php
$response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json");

echo $response; ?>

该页面在第 2 行终止,并出现以下错误:

  • 警告:file_get_contents():SSL 操作失败,代码为 1。OpenSSL 错误消息:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in …php on line 2
    • 警告:file_get_contents(): Failed to enable crypto in …php on line 2
    • 警告:file_get_contents( https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json ):未能打开流:操作在第 2 行的 …php 中失败

我们使用的是 Gentoo 服务器。我们最近升级到 PHP 5.6 版。出现这个问题是在升级之后。

我发现当我用 https://www.google.com 类的地址替换 REST 服务时;我的页面工作得很好。

在较早的尝试中,我设置了 “verify_peer”=>false ,并将其作为参数传递给 file_get_contents,如下所述: file_get_contents ignoring verify_peer=>false? 但就像作者指出的那样;它没有任何区别。

我已经询问了我们的一位服务器管理员,我们的 php.ini 文件中是否存在这些行:

  • 扩展=php_openssl.dll
  • allow_url_fopen = 打开

他告诉我,因为我们在 Gentoo 上,所以我们在构建时会编译 openssl;并且它没有在 php.ini 文件中设置。

我还确认 allow_url_fopen 正在工作。由于这个问题的特殊性;我没有找到很多帮助信息。你们有没有遇到过这样的事情?谢谢。

原文由 Joe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

这是一个非常有用的链接,可以找到:

http://php.net/manual/en/migration56.openssl.php

描述在 PHP 5.6 中打开 ssl 所做更改的官方文档 从这里我了解到我应该设置为 false 的另一个参数:“verify_peer_name”=>false

注意: 这具有 非常 重要的安全隐患。禁用验证可能允许 MITM 攻击者 使用无效证书窃听请求。虽然在本地开发中这样做可能很有用,但在生产中应该使用其他方法。

所以我的工作代码如下所示:

 <?php
$arrContextOptions=array(
    "ssl"=>array(
        "verify_peer"=>false,
        "verify_peer_name"=>false,
    ),
);

$response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json", false, stream_context_create($arrContextOptions));

echo $response; ?>

原文由 Joe 发布,翻译遵循 CC BY-SA 4.0 许可协议

修复了 macos 12.4 / Mamp 6.6 / Homebrew 3.5.2 / Openssl@3

终端

检查版本

openssl version -a

我的指向:

 ...
OPENSSLDIR: "/opt/homebrew/etc/openssl@3"
...

所以我查看了自制软件的目录 /opt/homebrew/etc/openssl@3 并找到了 cert.pem 并确保我的 Mamp 的当前版本的 php 的 php.ini 文件指向自制软件的正确 openssl 版本的 cert.pem

添加到 php.ini

 openssl.cafile=/opt/homebrew/etc/openssl@3/cert.pem

原文由 Christopher S. 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题