«невозможно получить сертификат локального эмитента» при попытке доступа к Microsoft Graph - PullRequest
1 голос
/ 29 июня 2019

Я хочу настроить приложение 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: невозможно получить сертификат локального эмитента

Что я должен сделать, чтобы преодолеть это?

1 Ответ

1 голос
/ 29 июня 2019

В системах 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);

Поэтому для временного исправления проблемы вы можете отключить проверку Peer, но делать это нужно только для тестирования.

$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"
...