Читаємо контейнер закритого ключа КріптоПро засобами openssl
Читаємо контейнер закритого ключа КріптоПро засобами OpenSSL +54
- 15.01.16 6:41 •
- shukan •
- # 275039 •
- Хабрахабр •
- 29 •
- 13300
- такий же як Forbes, тільки краще.
Варто згадати про існування утиліти P12FromGostCSP яка дозволяє конвертувати ключ в формат P12, доступний для роботи з OpenSSL, але утиліта має такі суттєві недоліки:- Читає контейнер не безпосередньо, а через криптопровайдер, тому там, де крім OpenSSL нічого немає, не працює.
- Якщо у властивостях ключа не зазначено, що ключ «експортований», то конвертувати його неможливо.
- У демо версії не формує файл з ключем, ця можливість присутня тільки в платній версії.
Містить 32 байта ключа в форматі Asn1. Це тільки половина ключа, повний ключ виходить при розподілі цього числа по модулю Q на маску. Поле, що зберігає модуль Q в бібліотеці OpenSSL має назву order. Маска лежить в файлі masks.key:
Містить 32 байта маски ключа в форматі Asn1, зашифрованого на ключі зберігання pwd_key. Далі 12 байт «затравочной» інформації для генерації ключа зберігання pwd_key, якщо криптоконтейнера захищений паролем, то пароль також бере участь в генерації ключа зберігання.
Далі контрольна сума (імітозащіти) 4 байта. Контрольної інформацією для простоти ми користуватися не будемо, загальний контроль буде здійснюватися шляхом генерації відкритого ключа та порівняння перших 8 байт отриманого ключа з відповідним полем з файлу header.key:

Основну роботу виконують такі 3 функції:
1. Створюємо ключ зберігання виходячи з 12-ти байтовой «солі» і пароля.
2. Розшифровуємо основний ключ на ключі зберігання.
3. Ділимо ключ з маскою на маску.
Але так як в бібліотеці OpenSLL операція ділення по модулю зазвичай не має, користуємося операцією взяття зворотного числа і множенням.
Далі збірка початкових кодів описана для Linux версії.
Версію для Windows можна завантажити звідси там же є сертифікати і закритий ключ для тестування, для зборки буде потрібно безкоштовний компілятор Borland C ++ 5.5
Компіляція OpenSSL бібліотеки
Після завантаження та розпакування вихідних текстів openssl в цільової директорії виконуємо команди:
Отримуємо готову бібліотеку libcrypto.a в поточній директорії.
Також будуть потрібні заголовки з директорій engines / ccgost і include.
компіляція privkey.c
Формування файлу закритого ключа private.key
Тестовий закритий ключ в криптоконтейнера lp-9a0fe.000, сертифікат відкритого ключа signer.cer і інші файли для тестування можна взяти звідси
Отримуємо результат роботи:
Cохраняющим в private.key
Користуємося закритим ключем private.key для підписування файлу file.txt
перевіряємо підпис
Все працює просто чудово!
Є деяка біда з цими токенами. Полягає вона в тому, що підтримка цих токенов повинна бути зроблена на сайті за допомогою плагіна, яких зараз вже невеликий зоопарк. Зробити функціонал ЕП по ГОСТу за допомогою стандартних механізмів браузера у таких токенов на жаль не можна. З плагінами є інша біда: велика частина полігонів використовують NP API, який випиляний з Хрома і ось-ось випив з Firefox.
Під виндой робота з даними токенами теж не найзручніший варіант, так як при роботі з ними через Crypto Pro або інше популярне ЗКЗІ даний токен перетворюється на гарбуз флешку. Робота Microsoft Crypto API підтримана тільки для RSA частини цього токена. А ось функціонал ГОСТІВСЬКА функцій по апаратної підписи треба тягнути через PKSC # 11, але програм, які підтримують таке під виндой на додаток до MS Crypto API вдень з вогнем.
Як флешка монтується звичайна флешка з контейнером у вигляді окремої папки. В общем-то це найпопулярніший і найдоступніший тип токена у випадку з крипт-ПРО. І з нього-то витягнути ключі найскладніше, тому що формат зберігання -пропріетарний.
Зі справжніми токенами набагато легше - є pcsk11-tool, є, врешті-решт, утиліти від виробників токенов. Якщо ключ згенерований на токені як неекспортіруемий, то, природно, його нічим не витягнеш, але, як правило, ключ роблять вивантажують, щоб можна було зробити копію, тому що ймовірність використання ключа зловмисниками набагато нижче, ніж ймовірність його, наприклад, втрати або поломки .
як правило, ключ роблять вивантажують, щоб можна було зробити копію Жах який. Хто і де робить ключ вивантажувати? У нормальних компаніях з «втратою або поломкою» борються просто: спрощенням реєстрації нового ключа. В ідеалі - це повинен мати можливість зробити сам клієнт без участі служби підтримки - приблизно так.
Саме дебильное - що ж хто-то что-то там адже перевіряє, сертифікує, розбирає. Купа грошей крутиться. Але при цьому саме елементарне - схоже ніхто не перевіряє. Навіщо тоді все це? Тобто я розумію, що для більшості людей «безпека - це така галочка, без якої клієнти не прийдуть / договір не підпишуть», а як воно там реально захищає ваші дані - неважливо, але, чорт забирай, всього ж є межа!
Виявлення експортованого ключа в продакшені - це ж ПП. Хтось щось настільки не розуміє, що «з дуба впав» і вирішив дискредитувати всю ідею апаратних токенів ... А тут оказиватся, що «як правило ключ роблять вивантажувати» ... сумно це ...
це ви просто з роботою зі СМЕВ не стикалися ...
Не стикався. І проводку у себе в будинку не я монтував. І навіть систему гидроусиления керма я не чинив. Але що це, власне, змінює.
Зворотний бік української «кмітливості»: якщо хтось розробив систему, в якій щось робити незручно, елементарна операція реєстрації додаткового ключа (яка повинна бути елементарної і безкоштовної) вимагає купу часу і сил і / або грошей, то ми це якось небудь обійдемо. «Жучок» поставимо щоб пробки не горіли, датчик кувалдою заб'ємо, якщо він на своє місце не лізе, ключі експортованими залишимо. Все - з найкращих спонукань.
А потім - вдома горяд, ракети падають, гроші пропадають.
Сенс існування кріптотокена - в неизвлекаемости поміщених в нього ключів. Це, власне, єдине виправдання його сущесвованія. Використовувати експортовані ключі поза розробки - має бути як мінімум приводом для звільнення за халатність, а як максимум - і для залучення до відповідальності (в залежності від того кому і скільки таких ключів було видано).
А то над паролями, записаними на папірці і приклеєними до монітора - всі сміються. А коли ключі видаються з PINом 12345678 і з експортованими ключами - це ніби «так і треба» ...
Я вам навіть більше скажу. На сьогоднішній день більша частина УЦ використовує в роботі софт КріптоПро, який дозволяє створювати пари ключів тільки на убогих токенах. Більш того, переважна частина УЦ не дає (своїми регламентом) клієнтам можливості отримати сертифікат за запитом сертифіката.
Таким чином, все набагато гірше, тому що приватний ключ генерує УЦ. Причому він може його скопіювати собі в цей момент.
Якщо ви дійсно знаєте, що таке безпека, то, звичайно, витратите час і знайдете УЦ, який працює з запитами. Але більшість УЦ, а отже і їх клієнтів живуть ось так от.
Для чого взагалі потрібно платити гроші за такий ключ? Купити найдешевшу флешку і все. У Казахстані, наприклад, так і є. Ти отримуєш сертифікат від держави для отримання держпослуг. При отриманні можна або принести свою флешку, або дати посвідчення, в якому вбудований кріптотокен (але потрібен спеціальний рідер), або заплатити гроші і отримати USB-токен. Купувати втридорога флешку - дивно адже. Або це обумовлено цим софтом, який Новомосковскет ключі тільки з цієї брендової флешки?
Це обумовлено вимогами до безпеки. Приватний ключ з кріптоключа вийняти не можна (теоретично - навіть з використанням електронного мікроскопа можна, практично - як мінімум не можна це зробити за допомогою «підручних» засобів).
У мене, скажімо, подібний ключик вставлений раз і назавжди в ноут, в якому і їздить. Поки він знаходиться в моєму розпорядженні - все, що з його допомогою виробляється - це моя відповідальність і мої проблеми (якщо я його загублених або, скажімо, митники заберуть ноут і відправлять «на перевірку» - я повинен негайно про це повідомити, щоб ключ анулювали ).
Головне: так як ключ скопіювати не можна, то ніякі «відмазки» і «підступи конкурентів» до уваги не приймаються: ключ був у мене в руках - значить я за те, що сталося з його допомогою і відповідаю.
Який сенс класти на такий ключ експортований сертифікат - науці, зрозуміло, невідомо. У цьому сенсі він працює як звичайна флешка і ніякої переваги над оной не має.
У мене, скажімо, подібний ключик вставлений раз і назавжди в ноут, в якому і їздить. Я такого уникаю, вставляю тільки коли треба щось підписати. У yubikey був security bug в openpgp-апплете, який дозволяв проводити операції без Піна.