@Eternal97

Почему OpensslPkcs7 не может прочитать приватный ключ при авторизации через ЕСИА Госуслуги?

Пытаюсь сделать авторизацию на сайте через ЕСИА. Для этого использую докер контейнер gost_php в котором установлен пакет https://github.com/ekapusta/oauth2-esia. Клиент отправил свой сертификат безопасности и закрытый ключ в виде 6-ти файлов(header.key, masks.key, masks2.key, name.key, primary.key, primary2.key). С помощью скрипта https://github.com/garex/nodejs-gost-crypto я преобразовал закрытый ключ из 6-ти файлов в один в формате PEM.
Vei1b.png
Далее скопировал ключ из терминала в файл private.key(не только сам ключ, но и заголовки начала и конца ключа). И пробросил сертификат и ключ в контейнер gost_php в папку certs.

Скрипт формирующий URI для обращения к API госуслуг.
<?php
use Ekapusta\OAuth2Esia\Provider\EsiaProvider;
use Ekapusta\OAuth2Esia\Security\JWTSigner\OpenSslCliJwtSigner;
use Ekapusta\OAuth2Esia\Security\Signer\OpensslPkcs7;

require "vendor/autoload.php";
require "envReader.php";
header('Content-Type: application/json');

loadEnv();
$file = fopen(getcwd().'/esia.log', 'a+');
fwrite($file, "start.php\n");

$certPath = getenv('CERT_PATH');
$privateKeyPath = getenv('KEY_PATH');

$clientId = $_GET['client_id'];
$redirectUri = $_GET['redirect_uri'];
$remoteUrl = $_GET['remote_url'];

$provider = new EsiaProvider(
    [
        'clientId'      => $clientId,
        'redirectUri'   => $redirectUri,
        'defaultScopes' => ['birthdate', 'gender', 'email', 'mobile'],
        'remoteUrl' => $remoteUrl,
        'remotePublicKey' => EsiaProvider::RESOURCES.'esia.test.public.key',
        'remoteCertificatePath' => EsiaProvider::RESOURCES.'esia.gost.prod.public.key',
    ],
    [
        'signer' => new OpensslPkcs7($certPath, $privateKeyPath, getenv('KEY_PASS')),
        'remoteSigner' => new OpenSslCliJwtSigner('/usr/bin/openssl'),
    ]
);
try {
    $link = $provider->getAuthorizationUrl();
    fwrite($file, $link."\n");
    $_SESSION['oauth2.esia.state'] = $provider->getState();
    fwrite($file, $_SESSION['oauth2.esia.state']."\n");

    $result = [
        'link' => $link,
        'state' => $provider->getState(),
    ];
    $result = json_encode($result);
} catch(\Exception $e) {
    fwrite($file, $e->getMessage()."\n");
    fwrite($file, $e->getTraceAsString()."\n");
    $result = [
        'error' => $e->getMessage()
    ];
    $result = json_encode($result);
} finally {
    fclose($file);
    echo $result;
}
return;


К этому скрипту я обращаюсь из своего laravel приложения через guzzle:

public function buildAuthLink()
    {
        $client = new Client();
        $response = $client->get($this->getLinkUrl, [
            'query' => [
                'client_id' => $this->appId,
                'redirect_uri' => $this->redirectUri,
                'remote_url' => $this->remoteUrl,
            ]
        ]);
        $body = json_decode($response->getBody(), true);
        dd($body);
        $link = $body['link'];
        $this->state = $body['state'];
        return $link;
    }


Но когда я пытаюсь продампить тело ответа вернувшегося через guzzle, я получаю exception:
array:1 [
  "error" => "Can not read private key ./certs/private.key"
]


Почему пакет не может прочитать закрытый ключ ?
  • Вопрос задан
  • 419 просмотров
Пригласить эксперта
Ответы на вопрос 1
@SbWereWolf
эникейщик
почитайте пост, маленько поймёте. https://habr.com/ru/companies/ubrr/articles/703466/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы