如何修复"Unable to connect to https://127.0.0.1 SSL certificate problem: self signed certificate"



我知道有很多关于这个话题的帖子,但是我试了很多,都没有效果。

curl_setopt($ch, CURLOPT_URL, "https://127.0.0.1:2288");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($ch, CURLOPT_USERPWD, $this->username . ":" . $this->password);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $pRequest);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));
curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CAINFO, "/etc/ssl/certs/cacert.pem");
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '2');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

当我在Ubuntu 20.04机器上执行它时,我得到这个错误:

Fatal error: Uncaught RuntimeException: Unable to connect to https://127.0.0.1:2288/ Error: SSL certificate problem: self signed certificate

证书是当前版本,来自curl.se/docs/caextract.html

php . ini:

extension=curl
extension=php_curl.dll
curl.cainfo="/etc/ssl/certs/cacert.pem"

如果不禁止curl ssl连接,我还能做什么?

如果您使用的是自签名证书,您要么必须将其添加到受信任的证书中,要么必须关闭验证。对于第二种情况,只需将CURLOPT_SSL_VERIFYPEER设置为false。

您正在安全地将连接到Ubuntu上的本地主机,并且,正如您的错误所示,您的服务器正在响应自签名的证书。您的代码指定curl应该尝试验证它连接到的主机(在您的示例中是localhost):

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '2');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

根据文档,CURLOPT_SSL_VERIFYHOST代码中2的值是这样记录的:

2验证SSL对等体证书中的Common Name字段或Subject Alternate Name字段是否与提供的主机名匹配。0表示不检查名称。1不宜使用。在生产环境中,该选项的值应该保持为2(默认值)。

如果您想严格遵循文档的建议,您必须将一些域映射到localhost,并在服务器上为该域安装证书。据我所知,你无法获得127.0.0.1的证书,因为这个特殊的IP地址总是指向本地主机…这是一个很长的故事,但是没有人会签署这样的证书。

你的另一个选择是告诉curl不验证ssl连接CURLOPT_SSL_VERIFYHOST为零:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// you may also need to set this?
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

告诉curl不需要验证证书。这个应该是相当安全的,如果你在控制你自己的服务器,如果你的服务器没有被泄露。

编辑我想补充的是,从curl下载证书提取。se只是获取一个广受信任的签名/证书包,这恰好是Firefox使用的包。此证书包用于检查您可能访问的任何,方法是将该域证书上的签名与一些由所谓可信组织签署的大/重要证书进行比较。它在验证自签名证书时永远不会有帮助。要了解更多关于这个复杂概念的信息,请尝试阅读Web of Trust。

我还应该提到,您可能能够使用一些命令来获取本地机器生成的证书并配置curl代码以使用该证书,然而,2CURLOPT_SSL_VERIFYHOST设置指示curl根据您正在连接的IP地址或域检查该证书的Common Name字段。在我的ubuntu工作站上,证书的通用名称是"ubuntu"——这与localhost或127.0.0.1都不匹配。为了使这种方法有效,你必须为你的机器生成一个新的证书,该证书具有与你连接的地址(localhost或127.0.0.1)相匹配的通用名称,或者你需要在本地网络上设置一些东西,将你的机器命名为"ubuntu"。

相关内容

  • 没有找到相关文章

最新更新