我知道有几篇关于这个话题的帖子,但我已经尝试了很多,但都没有奏效。
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 t.html中的当前版本
php.ini:
extension=curl
extension=php_curl.dll
curl.cainfo="/etc/ssl/certs/cacert.pem"
在不禁止curl ssl连接的情况下,我还能做什么?
发布于 2021-10-16 15:54:26
如果您使用的是自签名证书,则必须将其添加到受信任证书中,或者必须关闭验证。对于第二种情况,只需将CURLOPT_SSL_VERIFYPEER切换为false即可。
发布于 2021-10-16 16:02:16
您正在安全地连接到Ubuntu上的本地主机,并且,正如您的错误所指出的,您的服务器正在使用自签名证书进行响应。您的代码指定curl应该尝试验证它连接到的主机(在本例中为localhost):
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '2');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
根据docs,CURLOPT_SSL_VERIFYHOST
代码中2
的值记录如下:
SSL2验证
对等证书中的通用名称字段或主题备用名称字段是否与提供的主机名匹配。0表示不检查名称。不应使用%1。在生产环境中,此选项的值应保持为2(默认值)。
如果您想严格遵循文档的建议,则必须将一些域映射到localhost,并在服务器上为该域安装证书。AFAIK,你cannot get a cert for 127.0.0.1是因为那个特殊的IP地址总是指的是说来话长的localhost...sort,但是对任何人来说签署这样的证书是没有意义的。
您的另一个选择是告诉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代码以使用该证书,但是,2
的CURLOPT_SSL_VERIFYHOST
设置指示curl根据您连接到的IP地址或域检查该证书的Common Name
字段。在我的ubuntu工作站上,证书的通用名称是'Ubuntu‘--这与localhost或127.0.0.1都不匹配。为了让这种方法起作用,你必须为你的机器生成一个新的证书,使用一个与你连接的地址匹配的通用名称(localhost或127.0.0.1),或者你需要在你的本地网络上设置一些东西来命名你的机器为'ubuntu‘。
https://stackoverflow.com/questions/69597045
复制相似问题