gpt4 book ai didi

php - MAMP 和 PHP “SSL operation failed with code 1”

转载 作者:行者123 更新时间:2023-12-04 02:53:20 31 4
gpt4 key购买 nike

编辑
我目前正在移动中,并且在我的 iPhone 上的 Stack Exchange 应用程序上只有 SO,所以下面的代码中的引号有一些奇怪的格式 - 抱歉!我在真实的代码中有真实的:)

两天来,我一直试图通过其他一些关于 SO 的问题来解决这个问题,但是这里...

只是想使用 file_get_contents()捕获位于同一服务器和同一域上的另一个文件的网页,并将其包含在内。我正在使用带有自签名证书的 MAMP 用于生产(以便我可以让服务器强制使用 SSL 等),所以我的 Mac 本地也有该证书为“始终受信任”,因为它显然是自签名的。

所以现在我有一个问题,我希望一个页面捕获另一个页面的内容。我最初尝试使用 cURL,但它失败了,没有给我任何异常,并且没有使用 curl_error() 的信息。所以我切换到 file_get_contents()我在哪里得到异常 SSL operation failed with code 1 ... ssl3_get_server_certificate:certificate verify failed
我认为这是 OpenSSL 不信任自签名的问题(但我认为它使用了底层操作系统的可信 CA?)并且我无法使用以下流上下文使其工作:

stream_context_create([
"ssl" => [
"allow_self_signed" => true
]
]);

如果我设置 verify_peerverify_peer_name为 false,则发出请求但未发送 HTTPS cookie,这会破坏整个过程。

我尝试将证书的实际文本添加到 cacert.pem MAMP 中 OpenSSL 目录下的文件,并将该文件设置在 openssl.cafilephp.ini 中的选项文件如另一个答案中所述,但可惜没有运气......

有任何想法吗?您的帮助将不胜感激!谢谢! ☺️💛

编辑 2
所以我使用 cURL 再次尝试,这次让 cURL 给我一些详细的文件输出,这就是它给我的(注意底部第三行):
*   Trying ::1...
* TCP_NODELAY set
* Connected to admin.voyagerisc (::1) port 8890 (#0)
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
* CAfile: /Applications/MAMP/Library/OpenSSL/certs/cacert.pem CApath: none
* SSL certificate problem: unable to get local issuer certificate
* Curl_http_done: called premature == 1
* Closing connection 0

...这是我将原始证书添加到顶部的文件.. 呃,卡住了!

最佳答案

TLDR;您需要成为您自己的(迷你)CA,以便您拥有可信任的根证书
所以经过几天的辛苦工作,我终于弄明白了这一点,我希望下面能帮助那些无疑会遇到这个问题的少数 MAMP/PHP 用户!!
基本上,file_get_contents()cURL在 OpenSSL 之上运行,并且(正如我现在了解到的,我是一个 SSL 菜鸟!)OpenSSL,就像每个设备基本上都有所有主要证书颁发机构根证书的大列表。因此,如果任何证书已由这些根证书之一签名,则在 OpenSSL 眼中是可以信任的。
现在您可以进入 OpenSSL 使用的具有所有大根证书的文件,我认为这就像将开发站点的原始自签名证书放在列表顶部一样简单,一切都会就位. 然而 ,出于某种原因,如果它不是 ,OpenSSL 不会信任它。根证书 .
长话短说,步骤如下:

  • 关注 this guide在 5 分钟内成为您自己的 CA。 (作为旁注,这意味着您现在可以信任 只是 新创建的根证书,并且对于您想要使用 SSL 的每个开发站点,使用该根证书进行自签名,您将不需要重新信任等)
  • 一旦您按照文章信任了根证书,然后 pointed MAMP 的 key 和证书具体站点 , 在您的 IDE 中打开 的 .pem 文件根证书您创建的,而不是您的开发站点的特定站点
  • 对于 MAMP,OpenSSL 用作受信任证书颁发机构核心列表的文件位于 /Applications/MAMP/Library/OpenSSL/certs/ - 打开 cacert.pem也在您的 IDE 中
  • 现在,在注释下方和第一个真正的 CA 之前,复制并粘贴根证书的原始数据。您还可以在该长数据之前(和 BEFORE -----BEGIN CERTIFICATE----- 行)之前添加您在步骤 1 中为证书颁发机构设置的名称,并使用 = 对其进行格式化。与其他证书颁发机构一样。
  • 通常:保存并重新启动 MAMP

  • 现在,如果您使用 MAMP 运行本地开发服务器并启用了自签名 SSL,您现在应该能够将 SSL 调用返回到服务器本身,并让服务器信任......本身?我猜?想想就奇怪!
    最后一点,如果您在 SO 上访问过任何其他类似问题,您会看到许多答案提示您使用 get_file_contents() 创建流上下文。或使用您的 cURL 设置一些选项建议转的资源 "verify_peer" => false & "verify_peer_name" => false在流上下文中,或 cURL 的等效选项中.我 压力不够该方法完全违背了 SSL 的目的,甚至不应该用于本地开发,因为您可能忘记将其重新打开或其他一些导致信任在生产中保持关闭的模糊事件。
    我上面描述的方法更乏味,是的,但它会帮助您完成开发,直到您在生产中拥有由真正 CA 签署的真正 SSL 证书,此时这甚至不再是问题。
    如果这个解释不够清楚/不够准确,请随时发表评论,我只是还在理解它!干杯:)

    关于php - MAMP 和 PHP “SSL operation failed with code 1”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54027119/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com