Пытаюсь сделать авторизацию на сайте через ЕСИА. Для этого использую докер контейнер 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.
Далее скопировал ключ из терминала в файл 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"
]
Почему пакет не может прочитать закрытый ключ ?