R
R
Roman Sopov2016-07-27 15:47:14
OpenSSL
Roman Sopov, 2016-07-27 15:47:14

How to make Detached GOST R 34.10 CMS signature on Node.js?

Actually the question is: how to make a CMS signature in Node.js?
There is a Crypto PRO key exported to the PKCS # 12 format. The signature is required for the OAuth2 protocol for ESIA, and I want to do without CryptoPRO.
Openssl: GOST2001-GOST89-GOST89, GOST94-GOST89-GOST89
crypto.getCiphers: GOST 28147-89, gost89, gost89-cnt

Answer the question

In order to leave comments, you need to log in

1 answer(s)
D
dibrovsd, 2019-10-03
@dibrovsd

It works for me like this. Extract only the key from the container
# p7m signed file container
openssl cms -sign -inkey ~/certs/private_2018.key -signer ~/certs/sphere.pem -engine gost -binary -outform DER -in file3.pdf -out file3. p7m
openssl cms -verify -binary -CAfile ~/certs/CA.cer -in file3.p7m -inform DER
Here's another quick guide on how to add GOST support to OpenSSL.
I think it's possible to call the console command from node and read the result.
Here's another rough draft of the instructions I followed while I was setting it all up.

1) Добавление поддержки алгоритмов в openSSL

1.1) В версии до 1.0 ее просто нет (тут нужно ставить платную версию от КриптоПро) или компилировать вручную из исходников новую версию.
Это я не делал, поэтому пропускаю

1.2) OpenSSL версии 1.0 (1.1 по другому)
gost engine входит в операционную систему уже. Чтоб подключить engine, нужно

nano /etc/ssl/openssl.cnf

сразу до секции [ new_oids ]
вписать
"openssl_conf=openssl_def"

и в самом низу файла

[openssl_def]
engines = engine_section

# Engine scetion
[engine_section]
gost = gost_section

# Engine gost section
[gost_section]
engine_id = gost
dynamic_path = /usr/lib/x86_64-linux-gnu/openssl-1.0.2/engines/libgost.so
default_algorithms = ALL

Возможно, libgost.so engine окажется немного не там где у меня

1.3) OpenSSL версии 1.1
Было принято решение убрать из ядра поддержку gost и теперь она на github-е
Нужно ее скачать и выполнить инструкции по установке.
В debian нужно поставить вот эти компиляторы и заголовки к libssl
apt-get install libssl-dev make cmake
https://github.com/gost-engine/engine/blob/master/INSTALL.md
Тут по инструкции все просто и оно рабочее.
Тут же есть и как правильно модифицировать конфиг openssl

2) Где достать всю цепочку сертификатов (мне для версии 1.1 этого не потребовалось почему-то)
После установки КриптоПро и сертификата с
https://ca.kontur.ru/about/certificates
Они выданы неким "Головным удостоверяющим центром". Этот сертификат появляется в системе после установки КриптоПро
и их можно экспортировать в файлы уже

3) Как вытащить приватный ключ из контейнера КриптоПро вы уже знаете.
https://habrahabr.ru/post/275039/
компилировать и ставить Borland C++ не обязательно (там можно скачать уже готовый файл exe под win)

4) Сертификат (публичную часть ключа вы можете прислать довольно просто)
Итак, у нас есть приватная и публичная часть и CA (это цепочка сертификатов до корня). Можно не мучатся и просто закинуть сертификат Контур-а в доверенные в linux и забыть о нем (но мне для 1.1 это не понадобилось)

4.1) Перегнать в форму pem
openssl x509 -inform der -in sphere.cer -out sphere.pem
openssl pkcs12 -in p12.pfx -nocerts -out private.key
openssl pkcs12 -info -engine gost -nodes -in sphere.pfx

openssl pkcs12 -info -engine gost -nodes -in sphere.pfx -password pass:Dsgdfh46yu56hsgdfgdgh

openssl pkcs12 -nocerts -out PushKey.pem -in p12.pfx -nodes -password pass:Dsgdfh46yu56hsgdfgdgh
openssl pkcs12 -nocerts -out PushKey.pem -in sphere.pfx -nodes -password pass:Dsgdfh46yu56hsgdfgdgh

5) Шифрование и расшифровка
openssl smime -encrypt -engine gost -gost89 -in test.txt -out test.txt.enc sphere.pem
openssl smime -decrypt -engine gost -gost89 -in test1.PDF -inform=DER -out test1_dec.pdf -inkey /home/www/certs/private_2018.key

6) Подпись и ее валидация
openssl cms -sign -inkey ~/certs/private_2018.key -CAfile ~/certs/CA.cer -signer ~/certs/sphere.pem -engine gost -binary -in file3.pdf -out file3.pdf.sign
openssl cms -verify -CAfile ~/certs/CA.cer -signer ~/certs/sphere.cer -engine gost -binary -content file3.pdf -in file3.pdf.sign

6.1) Контейнер файла с подписью p7m
openssl cms -sign -inkey ~/certs/private_2018.key -CAfile ~/certs/CA.cer -signer ~/certs/sphere.pem -engine gost -binary -stream -outform DER -nodetach -in file3.pdf -out file3.p7m
openssl cms -verify -binary -CAfile ~/certs/CA.cer -in file3.p7m -inform DER

Есть вариации на тему в какой форме подпись или шифрованный файл. Это решается за счет параметра
-inform=DER (бинарная форма)
-outform der (для отсоединенной формы)

Ссылки по теме:
http://big-town.narod.ru/openssl.html  (основная, которая помогла)
https://habrahabr.ru/post/275039/

Второстепенные:
https://stackoverflow.com/questions/12790572/openssl-unable-to-get-local-issuer-certificate
https://www.altlinux.org/ГОСТ_в_OpenSSL
https://toster.ru/q/28353
https://kirill-zak.ru/2015/08/13/298
https://gist.github.com/aamalev/920f1dff286222ef73d7
http://sysadmins.ru/topic478444.html
http://www.ssl.ua/news/most-common-openssl-commands/
http://soft.lissi.ru/ls_product/skzi/OpenSSL/

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question