Статус: Новичок
Группы: Участники
Зарегистрирован: 08.12.2023(UTC) Сообщений: 2  Сказал(а) «Спасибо»: 1 раз Поблагодарили: 2 раз в 1 постах
|
Цитата: А можете сказать, насколько длинной у вас получается подпись через "csptest -keys -cont 'cont-name' -sign GOST12_256 -in /tmp/to_sign -out /tmp/to_sign.sig -keytype exchange"? У нас получается весьма короткая. После кодирования в base64 всего 86 символов. И проверку в ЕСИА она не проходит, что в прямом порядке байт, что в зеркальном. Всё время ESIA-007053.
При этом, если формировать отсоединённую подпись через команду "cryptcp -signf -strict -detached -cert -der -thumbprint 12345678 /tmp/to_sign -dir /tmp", то истоговая строка после base64 выходит гораздо длиннее - 4343 символа.
К сожалению, пока не возможности посчитать точное кол-во символов. Я использую вариант без отсоединенной подписи, кол-во примерно такое же как у вас. Для лучшего понимания выкачу суть реализации. У нас была на php + микросервис на typeScript : PHP Цитата: public function getAuthLink(): string { $state = Str::uuid()->toString(); $params = $this->signParams([ 'response_type' => 'code', 'access_type' => 'offline', 'redirect_uri' => $this->redirectUrl ],$state); $authQuery = http_build_query($params, '', '&', PHP_QUERY_RFC3986); $authURL = $this->esiaHost . 'aas/oauth2/v2/ac';
return $authURL . '?' . $authQuery; }
private function signParams($params, $state): array { $time = Carbon::now()->format('Y.m.d H:i:s O'); $clientId = $this->clientId; $scope = implode(' ', $this->scope); $text = empty($this->code) ? implode('', [$clientId, $scope, $time, $state, $this->redirectUrl]) : implode('', [$clientId, $scope, $time, $state, $this->redirectUrl, $this->code]); $client = new Client(); $certificateHash = $this->esiaCertHash; $response = $client->post($this->cryptoProServiceAddress . '/sign', [ 'json' => ['text' => $text], ]);
$clientSecret = json_decode($response->getBody()->getContents())->result;
return array_merge([ 'client_secret' => $clientSecret, 'client_id' => $clientId, 'scope' => $scope, 'timestamp' => $time, 'state' => $state, 'client_certificate_hash' => $certificateHash, ], $params); }
TSЦитата:const getContainerPath = async () => {
const response = await execute('csptest -keys -enum_cont -verifycontext -fqcn') const match = response.match(/\\\\\.\\HDIMAGE\\([^\s]+)/); if (!match) { throw new InternalException('Cannot get container. It seems that service is not correctly configured') } return match[1] }
export const cryptoProSign = async (str: string): Promise<string> => { const containerPath = await getContainerPath(); const tempFile = tempy.file({ extension: 'unsigned' }) const signedFile = tempFile + '.sgn' await writeFile(tempFile, str) const dirName = dirname(tempFile) try { const cmd = `csptest -keys -cont '${containerPath}' -sign GOST12_256 -in ${tempFile} -out ${signedFile} -keytype exchange -password "${CERTIFICATE_PIN}"` await execute(cmd) const result = await readFile(signedFile) await unlink(signedFile) await unlink(tempFile) const reversedContent = Buffer.from(result).reverse(); return reversedContent.toString('base64'); } catch (e) { logError(`sign error ${e}`, '', 'СryptoProSign') throw new InternalException('Failed to create sign. It seems that service is not correctly configured' ) } } Цитата:Параметр redirect_uri менял и так и этак. В описании тестовой системы уже добавлено всё, что можно: и с localhost, и с 127.0.0.1, и сами хосты, и полный url. В методических рекомендациях к aas/oauth2/v2/ac в примере указан обычный полный урл возврата для тестового сервера. Ну в ЕСИА мы же передаем не только 1 redirect_uri, как минимум на получение кода, в подпись мы отправлем еще 4 параметра(порядок, кстати, важен!): 'client_id','scope','timestamp','state' - возможно там есть какое-то расхождение?! Так же по сертификату, вы тестируете на боевом или тестовом, который был выдан? Цитата: Загруженные на тестовый стенд сертификаты активны - Госуслуги не дают загрузить просроченные. Пробовал в запросе на получение токена два варианта параметра client_certificate_hash (от рутового и пользовательского сертификата) - оба были вычислены с помощью утилиты вот так (для пользовательского):
Кстати, я юзал пользовательский. Отредактировано пользователем 8 декабря 2023 г. 13:36:31(UTC)
| Причина: Не указана
|