-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
privkey fails to read containers created by CryptPro 5.0 #1
Comments
Добрый день! Только что увидел Ваш комментарий, извините!
Короче, скорее всего выходом будет печатать primary.key header.key сначала в текстовый файл через какой-нибудь dumpasn1 а моя утилита далее парсит уже полученный текст. А если вдруг проблемы - всегда можно из текстового файла редактором выкинуть все непонятные поля. Основная проблема, как я понимаю, именно в том, что в 5.0 добавили новые поля? Если честно я версию 5.0 почти не смотрел. Эту версию уже сертифицировали? |
Спасибо за ответ.
|
Это какой ключ? Это 512-тибитный неправильный? Я когда проверял - вроде бы всё правильно во всех позах (см пункты 6 и 7 в readme.md) , надо только не забывать "переворачивать" ключ, в OpenSSL он лежит старшими битами вперёд, то есть наоборот чем в Крипто-Про. Хотя стоп! Вспомнил глюк - для одной из «поз» ЭП не работает, есть проблемы с параметром id-tc26-gost-3410-12-256-paramSetA, а именно openssl подписывает таким ключом (то есть ключ вроде бы правильный и подходит к сертификату, потому что если ключ неправильный, например мусор - то openssl ругается по-другому) но проверка ЭП для ключей с такими параметрами с помощью openssl говорит — подпись неверна. Пока нет времени с этим разбираться. Вы про этот глюк говорите? Я думаю, что дело не в openssl, и не в библиотеке, которая поддерживает ГОСТ (gost.dll) а в стыковке между ними. Как ни странно, чтобы gost.dll заработал с openssl нужно долго плясать с бубнами, если и то и другое собирать из исходников. А готового решения почему-то нет (я имею ввиду нет нигде с поддержкой id-tc26-gost-3410-12-256-paramSetA). Или это под Windows нет, а под Linux всё есть? Я лично под Windows пробовал искать, надо Linux последний накатить и по репозиториям пройтись. Тут уже Ubuntu 19.10 "Eoan Ermine" вышла, как время летит! |
В итоге ключ с параметрами А этот ключ как ни странно заработал! |
Неправильный ключ означает 1) используется неверный ключ из двух имеющихся в контейнере 2) у ключа неправильные параметры. Как я уже написал ранее, я эти проблемы в своем парсере решил после экспериментов и вдумчивого чтения RFC и спеков от ТК26. Еще одним источником информации для меня был gostCrypto, но он тоже создает несовместимый с КриптоПро ключ. Взаимная работа gost-engine и openssl - это совершенно отдельная история. |
Спасибо, понятно! Я лично ТК-26 не читал и 5.0 версию почти не видел и с двумя ключами не работал. А зачем 2 ключа в одном контейнере? Для шифровалки и для ЭП отдельно что-ли? До чего дошёл прогресс! |
Два ключа в контейнере видимо для совместимости с API провайдера в win32: AT_KEYEXCHANGE/AT_SIGNATURE, КриптоПро создает два ключа даже в очень старых своих версиях. Что интересно, КриптоПро для ЦП использует ключик AT_KEYEXCHANGE, соответственно для совместимости нужно использовать именно его. |
Да, действительно для совместимости нужны 2 ключа. И последний вопрос - а в Ваших экспериментах удалось ключ в позе '1.2.643.7.1.2.1.1.1': 'id-tc26-gost-3410-12-256-paramSetA', прикрутить к openssl после конвертации? Это же самый лучший ключ на данный момент. Потому что ключи 512 бит даром никому не нужны, а из 256 бит этот алг самый быстрый - на 10% быстрее, чем все остальные. И поддерживает ли его сейчас gostCrypto.js ? Год-два назад точно не поддерживал. |
curve 1.2.643.7.1.2.1.1.1 в paramset поддерживается везде: openssl, gost-engine, gostCrypto. Стоит заметить, что gostCrypto не обновлялся давно и не смог прочитать ни одного из моих тестовых контейнеров КриптоПро, однако есть его форк, который читает все контейнера: nodejs-gost-crypto Александра Устименко. Ключи с длиной 512 бит используются банками повсеместно. |
Ну я работаю на Московской бирже и в проме ни разу не встречал.
Это если я правильно понимаю эту строчку из файла gostSign.js : А я же говорил, что не работают вот эти ключи (см ниже zip). Это кривые Эдвардса 256 бит. Их нет в gostCrypto вообще, а в gost-engine (плюс openssl) ЭП создается, но не проверяется. Посмотрите, пожалуйста, своей утилитой эти мои ключи - выкладываю mime64 для ZIP архива с ключами Крипто-Про: -----BEGIN ZIP----- Короче у меня не получилось с этим ключом работать через openssl - ЭП не проверяется! А вот цепочка от него, на всякий случай, вдруг потребуется. -----BEGIN CERTIFICATE----- И это сам серт от этого ключа: -----BEGIN CERTIFICATE----- Только смотрите быстрее, серты в 2020 году просрачиваются) |
Я посмотрел бы на исходный контейнер, сертификат же мне для проверки не нужен, так как с помощью созданного ключа я генерирую самоподписанный сертификат средствами openssl+gost-engine. |
Контейнер (файлы header.key primary.key) в zip файле, а zip закодирован в mime64 (он же base64 он же pem) см выше. |
Кстати, надо это мне тоже попробовать, есть подозрение что если openssl ЭП не проверяет, то и серт не сделает. |
|
Я не знаю, мне год назад прислали для тестирования все позы, в том числе и эту 1.2.643.7.1.2.1.1.1 - см файл header.key
Что-то не то получилось. У меня выдает вот такое: -----BEGIN PRIVATE KEY----- А в hex вот это: А Вы делаете для него публичный ключ для проверки? |
Ух, ошибочка вышла. X/Y это куски от вычисленного открытого ключа. Закрытый ключ начинается с 71 1d b1 5a. И да, я проверяю вычисленный открытый ключ с 8 байтами в контейнере. В контейнере 8 байт это c2 2b c9 44 85 09 09 f5 |
А можете пожалуйста выложить исходный код вашего парсера на github? У меня тоже возникли проблемы с использованием данной утилиты, ни один из 5 контейнеров (3 из них получены от госуслуг для интеграции ЕСИА для тестов) не сконвертировались |
К сожалению пока не могу выложить исходники, так как код был написан в рамках работы над внутренним проектом компании. Позже мной так же была написана утилита, функциональный аналог p12fromgostcsp, руководством планируется публикация ее кода под открытой лицензией. |
Хорошо, спасибо Вроде нашёл способ конвертирования на gostcrypto.com с примерами и исходным кодом, тестовые контейнеры сконвертировались, надо потестить |
Пожалуйста сообщите результаты тестирования. Когда я тестировал свои контейнеры с gostcrypto, то оказалось, что полученный ключ неправильный и цифровая подпись, созданная с помощью него и openssl, не проверяется КриптоПро и наоборот. |
Тестирую на свежем криптопро 4.0 сертификате который недавно получил:
|
Это я, Михаил, автор privkey - смотрю, тут такая дискуссия развернулась не на шутку ))
Скорее всего, там у криптопрошников поменялось что-то в ASN1 формате, а утилита не разбирает формат, а просто считывает поля в порядке следования. Достаточно поменять их местами и будет "can not read container". В идеале, конечно, хотелось бы получить Ваш ключ, тогда если этот ключ нормально грузит CryptoPro-CSP то смог бы поправить утилиту. Но я понимаю, что он секретный и Вы не пришлете все файлы - но может хотя бы вышлете свой header.key файл? Думаю, ошибка там, а header.key не секретный, там только сертификат (иногда) лежит. Кстати, есть идея - убрать из утилиты privkey анализ header.key совсем, но тогда нужно будет вводить "параметры ключа" вручную. Но так как их штук 5 всего, можно все перебрать и тогда header.key получается и вовсе не нужен. Короче вот так можно сделать. Попробую на выходных.
А что за RSA ? Разве ЕСИА умеет RSA ? |
скажите на какую почту, я пришлю
я интегрировал ЕСИА на сайт в 2018 году и тогда она умела, и сейчас умеет. |
с этой ошибкой разобрался, так что получилось выдернуть с помощью get-cpcert валидные сертификат и ключ и теперь всё работает/подписывается |
Отлично! А я сейчас собрал openssl 1.1.1e + gost (под Windows с большими танцами с бубном, под ubuntu норм) и у меня наконец-то заработал параметр "кривые Эдвардса 256 бит" см выше, этот ключ я уже кидал в mime формате см ---- BEGIN ZIP --- если интересно. Год назад не работало. Наука не стоит на месте ) |
отправил вам header.key |
Не поделитесь? Для пунктов 6 и 7 |
Плюсу, выложите, пожалуйста новую версию |
Здравствуйте, во-первых, большое спасибо за Ваш труд, статья на Хабре и эта утилита очень помогают в понимании структуры контейнеров КриптоПро.
Однако, видимо в основном из-за максимально упрощенного кода по разбору asn1, privkey не смог прочитать у меня ни одного контейнера, созданного КриптоПро 5.0.
После изучения файлов в моих контейнерах я изменил смещение, по которому читаются ключи и после этого 3 из 4 моих контейнеров успешно прочитались и закрытый ключ из них был экспортирован. Контейнер, который по-прежнему не смог прочитаться - это единственный контейнер для КриптоПро Strong, с длиной ключа 512 бит. Все контейнеры с ключами длиной 256 бит успешно прочитались.
Возможно ли добавить полноценный asn1 парсер в privkey или как-то иначе решить проблему с чтением контейнеров КриптоПро 5.0?
The text was updated successfully, but these errors were encountered: