【问题标题】:How to fix "Unable to connect to https://127.0.0.1 SSL certificate problem: self signed certificate"如何解决“无法连接到 https://127.0.0.1 SSL 证书问题:自签名证书”
【发布时间】:2021-12-04 09:15:37
【问题描述】:

我知道有几篇关于这个主题的帖子,但我尝试了很多,但没有任何效果。

    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 连接,我还能做什么?

【问题讨论】:

  • 从 https 中删除 s?
  • @theking2 我认为重点是保持 s!
  • @NigelRen 我看不到通过加密通道访问本地文件的用例。
  • 为什么不加密一切?在开发系统中具有与在生产系统中相同的条件是一个用例
  • @theking2,正在测试吗?

标签: php ubuntu ssl curl php-curl


【解决方案1】:

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

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

根据docs,您的代码中2 的值CURLOPT_SSL_VERIFYHOST 记录如下:

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

如果您想严格遵循文档的建议,您必须将某个域映射到 localhost 并在您的服务器上为该域安装证书。 AFAIK,你 cannot get a cert for 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”。

【讨论】:

  • 如果我将CURLOPT_SSL_VERIFYHOST 设置为零,也会出现同样的错误
  • 嗯...它在我的机器上工作。我编辑了我的帖子,以便代码也将 CURLOPT_SSL_VERIFYPEER 设置为 false。希望这会有所帮助。
【解决方案2】:

如果您使用自签名证书,则必须将其添加到受信任的证书中,或者必须关闭验证。 对于第二种情况,只需将 CURLOPT_SSL_VERIFYPEER 切换为 false。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2019-12-11
  • 2020-09-20
  • 2023-03-02
  • 2018-11-16
  • 2021-02-14
  • 2017-05-10
  • 2014-11-01
  • 2021-02-20
相关资源
最近更新 更多