尝试访问Microsoft Graph时无法获取本地颁发者证书(&Q)

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

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

    $guzzle = new GuzzleHttpClient();
    $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证书问题:无法获取本地颁发者证书

我应该做些什么来克服这个问题?


解决方案

在Windows系统上,cURL有时无法访问CA-Certs。因此,您必须下载CA-Files并将其添加到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 GuzzleHttpClient();
$client->setDefaultOption('verify', 'curl-ca-bundle.crt');

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

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

相关文章