【问题标题】:"unable to get local issuer certificate" when trying to access Microsoft Graph尝试访问 Microsoft Graph 时“无法获取本地颁发者证书”
【发布时间】:2019-11-10 19:08:57
【问题描述】:

我想配置我的 Symfony4 应用程序以使用 msgraph-sdk-php 库来阅读和发送电子邮件。

我的第一次体验是这段代码:

    $guzzle = new \GuzzleHttp\Client();
    $url = 'https://login.microsoftonline.com/' . $tenantId . '/oauth2/token?api-version=1.0';
    $token = json_decode($guzzle->post($url, [
        'form_params' => [
            'client_id' => $clientId,
            'client_secret' => $clientSecret,
            'resource' => 'https://graph.microsoft.com/',
            'grant_type' => 'client_credentials',
        ],
        'verify' => false
    ])->getBody()->getContents());
    $accessToken = $token->access_token;

    $graph = new Graph();
    $graph->setAccessToken($accessToken);

    try {
        $user = $graph->createRequest("GET", "/me")
            ->setReturnType(User::class)
            ->execute();
    } catch (GraphException $e) {
        $user=(object) ['getGivenName'=>$e->getMessage()];
    }

    return "Hello, I am $user->getGivenName() ";

但是 Symfony 向我显示了一个异常页面,其中包含以下消息:

cURL 错误 60:SSL 证书问题:无法获取本地颁发者证书

我应该怎么做才能克服这个问题?

【问题讨论】:

  • @Dharman,我想你可能是对的,错误确实是由于缺少证书,并且通过编辑 php.ini 添加 curl.cainfoopenssl.cafile 密钥来解决,虽然我没有使用 Apache、Xampp 或 Wamp,而是使用 Symfony 自己的服务器。但是由于@RenéHöhle 花时间回答了我的问题,我认为保留帖子和他接受的答案是公平的。我觉得没有什么坏处,因为这些帖子现在已通过您的通知链接,并且始终采用相同的解决方案。
  • 为什么不两者兼而有之?接受答案和副本。但是,我知道副本有点在灰色区域中,我让您自己判断。
  • 好的,但是,我该怎么做呢?我编辑了我的问题以添加guzzle 标签,现在接受副本的按钮消失了……我不知道我可以同时接受这两个标签。我认为接受副本会删除我的帖子,所以它的答案......对不起。

标签: php symfony azure-active-directory microsoft-graph-api guzzle


【解决方案1】:

在 Windows 系统上,cURL 有时无法访问 CA-Certs。所以你必须下载 CA 文件并将它们添加到 Curl。您可以在此处下载证书:

http://curl.haxx.se/docs/caextract.html

curl_setopt($ch, CURLOPT_CAINFO, __DIR__ . "/certs/cacert.pem");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

因此,要临时解决问题,您可以禁用对等验证,但您应该只在测试时这样做。

$client->setDefaultOption('verify', false);

那么应该可以连接了。要将证书添加到以下内容,但您必须先下载证书。

$client = new \GuzzleHttp\Client();
$client->setDefaultOption('verify', 'curl-ca-bundle.crt');

或最后一个解决方案将 ca 文件添加到您的 php.ini(来自 curl.haxx.se 的文件):

curl.cainfo = "[pathtothisfile]\cacert.pem"

【讨论】:

  • 该错误确实是由于缺少证书,我通过编辑php.ini 添加curl.cainfoopenssl.cafile 密钥来解决。有一个难点:我必须将Brazilian Root Certification Authority 添加到.pem 文件中。现在我得到一个不同的错误,大声笑:客户端错误:GET https://graph.microsoft.com/v1.0/me 导致403 Forbidden 响应:{“错误”:{“代码”:Authorization_RequestDenied”,“消息”:“权限不足,无法完成操作(截断...) 但这是一个不同的问题。
  • 所以,我会接受你的回答,因为它解决了问题。
猜你喜欢
  • 2016-04-20
  • 2021-03-11
  • 2019-04-12
  • 2018-06-20
  • 2023-03-28
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 2017-08-31
相关资源
最近更新 更多