MAMP和PHP“SSL操作失败,错误代码为1”

6

编辑 我现在正在移动中,只有在我的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_peer和verify_peer_name设置为false,请求会被发送,但HTTPS cookie不会被发送,导致无法连接。我尝试将证书的实际文本添加到MAMP中OpenSSL目录下的cacert.pem文件中,并将该文件设置为php.ini文件中openssl.cafile选项,如另一个答案所述,但仍然没有成功...有什么建议吗?非常感谢您的帮助!☺️
编辑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

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


" "是您使用的实际引号吗?如果是,则需要用“ ”替换。 - Funk Forty Niner
抱歉,我现在正在移动中,机场的笔记本电脑无法连接WiFi,所以我在使用我的iPhone上的Stack Exchange应用程序,用我的两个拇指打出代码,哈哈。 - FrankieDee
好的,我会为您编辑它们。编辑完成。 - Funk Forty Niner
1
@FunkFortyNiner 哦,你是个传奇,谢谢! - FrankieDee
3个回答

6

简述; 您需要成为自己的(迷你)CA,以便拥有可信任的根证书

经过几天的艰苦努力,我终于弄清楚了这一点,我希望以下内容能够帮助那些不可避免会遇到此问题的少数MAMP / PHP用户!

基本上,file_get_contents()cURL在OpenSSL之上运行,并且(正如我现在所学到的那样,我是一个SSL新手!)OpenSSL就像每个设备一样,具有所有主要证书颁发机构的根证书的大列表。因此,如果任何证书由其中一个根证书签名,它就可以在OpenSSL眼中得到信任。

现在,您可以进入OpenSSL使用的文件,该文件包含所有重要的根证书,我认为将开发站点的原始自签名证书放在列表顶部会很容易,并且一切都会顺利进行。但是,由于某种原因,如果它不是根证书,OpenSSL将不会信任它。

长话短说,以下是步骤:

  1. 按照此指南的步骤,在不到5分钟内成为自己的CA。(作为旁注,现在您可以信任刚刚创建的根证书,在您想要使用SSL的每个开发站点上,都可以使用该根证书进行自签名,无需重新信任等等)
  2. 按照文章中所述,将根证书添加到受信任列表,并将MAMP指向特定站点的密钥和证书,在IDE中打开您创建的ROOT CERTIFICATE的.pem文件,而不是特定于您的开发站点的证书。
  3. 对于MAMP,OpenSSL用作受信任证书颁发机构的核心列表文件位于/Applications/MAMP/Library/OpenSSL/certs/ - 同样在IDE中打开cacert.pem文件。
  4. 现在,在注释下和第一个真正的CA之前,复制并粘贴您的根证书的原始数据。您还可以在那段长长的数据之前(并且在-----BEGIN CERTIFICATE-----行之前)添加您在步骤1中为证书颁发机构设置的名称,并像其他证书颁发机构一样使用=格式化它们。
  5. 保存并重新启动MAMP。
现在,如果您正在使用MAMP运行本地开发服务器并启用了自签名SSL,则现在应该能够进行SSL调用并使服务器信任...它自己?我猜?当您考虑它时会感觉很奇怪!
最后需要注意的是,如果您访问了SO上的其他类似问题,您会看到许多答案提示您使用带有get_file_contents()的流上下文或设置一些选项与您的cURL资源,建议在流上下文中将"verify_peer"=>false和"verify_peer_name"=>false打开,或者对于cURL的等效选项。我强调一遍,这种方法完全违背了SSL的目的,甚至不应用于本地开发,因为可能会忘记重新打开它或其他导致生产环境中的信任保持关闭的模糊事件。
我上面描述的方法更加繁琐,但它将使您在开发过程中通过,直到您拥有由真正的CA签名的真实SSL证书,在那时,这将不再是一个问题。

如果这个解释不够清晰/精确,请随意评论,我还在努力理解它!干杯 :)


太棒了的解释!虽然有点复杂,但是值得努力!感谢分享! - Rocket Fuel
3
进一步测试后发现解决方案可能要简单得多。MAMP有生成证书的功能,因此它配备了自己的根证书。事实证明,该证书仅未列在受信任的cacert.pem中。所以我最终打开了/Applications/MAMP/Library/OpenSSL/certs/MAMP_PRO_Root_CA.crt文件,在我的IDE中复制了代码,然后将其添加到/Applications/MAMP/Library/OpenSSL/certs/cacert.pem的顶部(注释后)。这样做能立即修复问题,而无需生成定制的根证书或为各个主机生成新证书。 - Rocket Fuel
/Applications/MAMP/Library/OpenSSL/certs/cacert.pem 有一个301重定向的HTML文件代码吗? - Mike
感谢FrankieDee的解释!也感谢RocketFuel指出了更短的方法! - bakis

6

如Mike在评论中提到的,目前MAMP(6.4)版本中添加了一个无效的证书文件,路径为/Applications/MAMP/Library/OpenSSL/certs/cacert.pem。只需打开此文件并访问301重定向显示的链接(https://curl.se/ca/cacert.pem),下载并替换该文件即可。


1
谢谢,这个让我在整整一天的头痛后得以解决。 - Amirgem
1
谢谢!简单的修复,避免了很多压力。 - rop
这同样适用于MAMP 5。 - joachim
哇,这个解决方案真是太简单了,而且正好符合我的需求。我刚刚修复了Guzzle和Google身份验证API,这些都是由于这个bug无法进行身份验证的,它们被Google Analytics和Google Cloud oAuth系统使用!很抱歉关键字有点多,只是希望使用这些东西或者WordPress的AIWP Analytics Insights插件的人能够通过谷歌找到这篇文章哈哈! - jerclarke
只想说,这对我已经没有任何影响了。无论它在那个时刻做了什么,现在都不再这样做了。我找到了一个新的解决方案,就是进入钥匙串访问,找到MAMP_PRO_Root_CA,并将其标记为始终信任,之后您就永远不必再添加任何子证书到钥匙串访问中了!文档有解释!https://documentation.mamp.info/en/MAMP-PRO-Mac/Settings/Hosts/SSL/ - jerclarke
显示剩余2条评论

1

MAMP_PRO_Root_CA标记为Keychain Access中的可信任证书

在遭受了大量麻烦和与此相关的问题后,随着Chrome的更新,情况变得越来越糟糕,我的自动化测试也出现了问题。最终,我在MAMP SSL文档中找到了解决方案。

我们只需将MAMP用于签署其自定义SSL证书的根证书添加到Keychain Access中,并将其设置为始终信任:

  • 在Mac上打开Keychain Access
  • 搜索MAMP_PRO_Root_CA
  • 双击它并展开Trust部分
  • 使用此证书时设置为始终信任
  • 关闭小窗口并输入您的系统密码以保存更改

在Keychain Access中设置弹出窗口的屏幕截图

之后,通过MAMP界面创建的任何SSL证书都将自动工作,据我所知!如果您通过终端创建自签名证书,您可能需要返回并更新它们,但这很容易且可靠,因此如果您已经致力于MAMP Pro生活方式的混乱,我不明白为什么您不想要。

这是您在MAMP Pro中创建SSL证书的UI:

突出显示MAMP Pro界面中的"创建新的自签名证书"

老实说,我无法确定这个解决方案是否一直在眼前,或者它是否在新版本的MAMP或Chrome中最近启用。最终,这并不重要。我们漫长的国家噩梦终于结束了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接