在同一本地主机上调用 API 时出现 SSL 验证服务器证书错误(tls_process_server_certificate:证书验证失败)

SSL Verify Server Certificate error when calling API on same localhost (tls_process_server_certificate:certificate verify failed)

我的困境是我在本地主机上有两个域 运行,domain_a 和 domain_b。它们都是 运行 nginx、apache 和 php-fpm。 domain_a 是 运行 CodeIgniter 3.0.0,domain_b 是 运行 CodeIgniter 4。在另一个虚拟机中,我在 Docker 容器中有 domain_a ,并且能够毫无问题地命中 domain_b 中的 API 个端点。开发工作要求它们都在同一台服务器上,因为这与在其他环境中的情况很接近。

具体来说,我们使用的是 PHP oAuth 模块,它会抛出“请求失败(不知道为什么)”的错误,非常[=40= 】 有帮助。经过一些挖掘,我发现我可以毫无问题地访问其他端点(例如 google.com 和这些域之外的已知端点)。我尝试使用 cURL 代替 oAuth(只是一个简单的测试来达到终点),但我总是遇到同样的错误。

tls_process_server_certificate:certificate verify failed

我使用的证书都是针对这两个域的自签名证书,我可以从浏览器内访问这两个域而不会出现问题。如果重要的话,两个域在登录时都有用户证书,但用户不一样,因为每个域都有自己的自签名 CA。

我目前的代码是这样的:

$conn = new OAuth($consumer_key, $consumer_secret, $oauth_sig_method);
$conn->enableDebug();
/*
if (is_on_local()) {
  $conn->setCAPath('path/to/cert.cert');
}*/
$conn->disableSSLChecks();
$token = $conn->getRequestToken($auth_url);

我将注释掉的部分留在其中以展示我的尝试 - 我尝试将其指向系统证书,domain_a CA 和 domain_b CA,none 其中有效。看起来(出于某种原因)$conn->disableSSLChecks() 不起作用,但我不确定。抛出的错误是在对 getRequestToken().

的调用中

我的 etc/hosts 文件:

127.0.0.1 domain_a.tld
127.0.0.1 domain_b.tld

实际的 TLD 不是 tld,但同样,它们在浏览器中工作,并且在 domain_a 位于 Docker 之前它工作。

我已经对 domain_a 进行了足够的调整,因此 CI 3 可以与 PHP 8 一起使用,因此我确信问题出在从一个域到另一个域的对话。我是 运行 RHEL 8,并且我已经将 SELinux 设置为 Permissive(我认为实际上是为了开发而禁用)。 httpd、nginx、php-fpm 或防火墙日志中没有任何内容。我拥有的唯一指标是我从 CI 3 登录 domain_a:

得到的
Severity: Warning --> OAuth::getRequestToken(): SSL operation failed with code 1. 
   OpenSSL Error messages:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in /path/to/file
Severity: Warning --> OAuth::getRequestToken(): Failed to enable crypto in /path/to/file
Severity: Warning --> OAuth::getRequestToken(domain_b/oauth/access): Failed to open stream: operation failed in /path/to/file

我觉得答案就在那里,我只是没有看到它。

像往常一样,在解释完我的问题后不久我就找到了解决方法。 目前,我的端点为 https://domain_b.tld/oauth/access。经过一些修补,我得到了一个关于 SSL 版本的不同错误。这让我走上了正确答案的轨道: http://domain_b.tld:port/oauth/access。我现在可以毫无问题地到达终点。我有一个虚拟主机文件,即使两个域都在同一个端口上,我也必须指定它或调用失败。 如果其他人遇到此问题,请检查基础 URL。我从来没有想过点击 http 而不是 https 作为解决方案。