gpt4 book ai didi

php - SSL证书问题: unable to get issuer certificate

转载 作者:太空宇宙 更新时间:2023-11-03 13:30:57 25 4
gpt4 key购买 nike

我目前正在使用证书在我的本地 Windows 计算机上的命令行中执行一个使用 curl 的 php 脚本来测试网站上的 API。但是脚本永远无法到达服务器。我已经为这个明显常见的错误查找了解决方案,并尝试了以下方法,但没有成功:

  • 确保证书仍然有效。
  • 确保在 php.ini 中启用了 openssl php 扩展,并且确实存在 .dll。
  • https://curl.haxx.se/docs/caextract.html 下载了最新的证书包,如对 this question 的回答中所述并将其添加到 php.ini 中。我还检查了我尝试联系的网站的证书颁发机构确实在那个包中(在我的例子中是 Comodo)。
  • 下载了接近网站证书有效期开始时间的旧证书包。
  • 通过 this link 直接从证书颁发机构下载了证书,并将 .crt 添加到我的 php.ini 文件中。
  • 使用 this tool 将上面检索到的 .crt 文件转换为 .pem ,然后将其添加到 php.ini(替换上面的那个)。

这是我用于测试的脚本(我仅在命令行中使用 php 执行它):

$data = 'username=myuser&password=mypassword';
$ch = curl_init('https://my.website.com/auth');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_VERBOSE, true);
//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_exec($ch);
curl_close($ch);

如果我取消注释其中的两行以完全绕过证书验证,它会完美运行,但我想避免这种情况。

在所有情况下,我都尝试过使用斜杠和反斜杠的路径,我确信使用了正确的 php.ini,并且 php 确实可以访问 .pem 文件位置。 php 脚本的输出证实了这一点(我已经替换了我正在使用的实际 url):

> *   Trying 192.168.200.11...
> * TCP_NODELAY set
> * Connected to my.website.com (192.168.200.11) port 443 (#0)
> * ALPN, offering http/1.1
> * successfully set certificate verify locations:
> CAfile: C:\Development\examples\COMODORSADomainValidationSecureServerCA.pem
> CApath: none
> * NPN, negotiated HTTP1.1
> * SSL certificate problem: unable to get issuer certificate
> * stopped the pause stream!
> * Closing connection 0

我目前没有想法检查我做错了什么以及如何解决它。

最佳答案

所以,最后,这就是我最终设法做到这一点的方法:正如错误所暗示的那样,几个答案也指出,我的配置中缺少证书颁发机构的证书链,并且不在包中从 https://curl.haxx.se/docs/caextract.html 下载.

事实上,要在 HTTPS 中成功连接到网站,除了您自己网站的证书之外,您还需要与您的证书颁发机构相关的其他证书。这可以在导出网站证书并使用专门用于此的工具将其可视化后在证书路径中检查。 Windows 有这样一个工具,默认情况下将与 .cer 文件一起使用 - 而不是文本编辑器。

通常,这些额外的证书默认已经存在,但在我的例子中,它们并不存在。我的认证路径如下所示:

Sectigo
|_____Sectigo RSA Domain Validation Secure Server CA
|_____*.example.com

我必须为我的证书路径的 3 个部分中的每个部分检索一个证书(总共 3 个证书)。

所以最后我找到了this question这为我指明了正确的方向:我必须以 .cer 格式导出我网站的证书(与 PEM 格式相同,只是另一个扩展名),在 Windows 中打开我的证书,并分别导出证书路径的每个部分以获得所有 3 个证书.

然后我将所有 3 个证书复制到从 https://curl.haxx.se/docs/caextract.html 下载的文件的末尾,我位于 C:/Development/examples/cacert.pem(你可能想将该文件放在离你的 php 安装文件夹更近的地方)。

然后,我将 php.ini 配置更改为

curl.cainfo=C:/Development/examples/cacert.pem openssl.cafile=C:/Development/examples/cacert.pem

这就成功了!我现在可以毫无问题地连接到该网站。

关于php - SSL证书问题: unable to get issuer certificate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55168352/

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