当前位置: 首页 > 知识库问答 >
问题:

cURL:CURLOPT_CAPATH包含正确的证书,但不起作用

邴和雅
2023-03-14

以下脚本适用于PHP5.6。23

$options = [
    CURLOPT_POST => 1,
    CURLOPT_URL => 'https://uat.dwolla.com/oauth/rest/offsitegateway/checkouts',
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_POSTFIELDS => json_encode(['name'=>'value']),
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_SSL_VERIFYPEER => true,
    CURLOPT_CAINFO => '/path/to/certs/GoDaddyRootCertificateAuthority-G2.crt',
];
$ch = curl_init();

curl_setopt_array($ch, $options);
if( ! $result = curl_exec($ch)) $err = curl_error($ch);
else $err = null;

curl_close($ch);

if($err) echo $err;
else print_r(json_decode($result,true));

我从Dwolla的支付API得到了预期的响应。为了使脚本更具动态性,我尝试将其更改为引用托管我希望信任的证书的目录。因此,我将最后一个选项(CURLOPT_CAINFO)更改为:

CURLOPT_CAPATH => '/path/to/certs'

但是,这会中断脚本,并且不会建立连接;错误是:

SSL证书问题:无法获取本地颁发者证书

我知道目录是正确的,证书文件是有效的,因为原始脚本引用了同一目录中的证书。我希望cURL扫描目录中的文件并找到它需要的证书,但这没有发生。为什么会这样?

共有1个答案

谈禄
2023-03-14

如果您只是将CApath指向某个目录并将证书放入该目录,则无法正常工作。为了有效地查找正确的CA证书,此目录中的文件需要具有从证书主题派生的名称。例如,您可以在/etc/ssl/certs中找到以下内容:

   ff783690.0 -> UTN_USERFirst_Hardware_Root_CA.pem
   ff588423.0 -> ComSign_CA.pem
   ...

这里的文件名基于证书主题的哈希值,并指向真正的证书。有关如何创建必要文件名的信息,请参阅如何计算CA文件名使用的哈希值。

另请参见openssl验证的手册页:

-CApath目录
受信任证书的目录。证书的名称应为:hash。0或具有此形式的符号链接(“哈希”是经过哈希处理的证书使用者名称:请参阅x509实用程序的-hash选项)。在Unix下,c_rehash脚本将自动创建指向证书目录的符号链接。

 类似资料:
  • 我使用phpUnit与cakephp进行测试,但当我试图运行一些测试类抛出一个致命错误,但这个类插入正确,甚至没有被指控丢失文件错误的PHPStorm。 执行测试用例的命令: C:\xampp\htdocs\PROJETOS\购物\供应商\phpUnit 致命错误: 致命错误:在第12行的C:\xampp\htdocs\PROJET OS\Shopping\tests\TestCase\Model

  • 我已经覆盖了和所以我不太确定出了什么问题。它们是使用 Eclipse 生成的(来源 -

  • 问题内容: 我在Express中有一个SSL服务器,该服务器不能在所有浏览器上运行(除非用户手动信任该网站),因为某些浏览器需要链证书(我们有自己的中间证书)。我已经将中间证书和连锁证书放在一个.crt文件中。链+中间证书在变量中。它似乎不起作用。我正在使用http://www.digicert.com/help并正在进行检查,但是它似乎没有返回中间+链证书。 这是我的设置方法: 在Firefox

  • 给了我一个错误: javax.net.ssl.sslHandShakeException:Sun.Security.Validator.ValidatorException:PKIX路径构建失败:Sun.Security.Provider.CertPath.SunCertPathBuilderException:找不到请求目标的有效证书路径

  • 我正在使用R rticles包中的Elsevier模板在Rstudio中生成pdf文档。对于这篇论文,我想包括一个.png图像。当我加载图像时 工作正常,但当我将其更改为等效的knitr命令时(我更喜欢这个命令,因为它更容易设置fig大小等)。 我得到以下错误: 当我在rmarkdown中切换到pdf的标准输出设置时,输出:pdf_document,knitr选项确实起作用,所以我猜问题一定与rt

  • 我有客户端和服务器配置使用TLS和自签名证书。 客户端SSL引擎配置为使用虚拟信任管理器,该管理器从不抛出CertificateException和空KeyManager数组。 服务器SSL引擎使用由手动生成的密钥存储文件初始化的密钥存储。 当我用JDK 8运行它时,我得到以下握手结果: 服务器无法验证证书 这是预期的行为。 当我使用JDK 11运行它时,我得到以下结果: 服务器失败与相同的错误(