Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Excerpt

Генерация ключевой пары ГОСТ Р 34.10-2001

Code Block
openssl genpkey -engine pkcs11_gost -algorithm GOST2001 -pkeyopt key_id:50 -pkeyopt paramset:A -pkeyopt pin:12345678   
  • key_id - ID ключа на токене
  • paramset - используемые параметры эллиптической кривой:
    • A - набор параметров с OID 1.2.643.2.2.35.1;

    • B - набор параметров с OID 1.2.643.2.2.35.2;

    • C  - набор параметров с OID 1.2.643.2.2.35.3;

    • XA - набор параметров с OID 1.2.643.2.2.36.0;

    • XB - набор параметров с OID 1.2.643.2.2.36.1;

  • pin - PIN-код токена

Формирование запроса PKCS#10 

Code Block
openssl req -engine pkcs11_gost -new -key 50 -keyform engine -out req.csr 
В процессе работы команда попросит ввести PIN-код. После этого потребуется указать данные для сертификата:
  • State or Province []: Moscow
  • Locality []:  RU
  • Organization Name []: Aktiv Company
  • Organizational Unit Name []: development
  • Common Name []: tester
  • Email []: tester@rutoken.ru

Набор вводимой информации при формировании запроса определяется конфигурационным файлом openssl.cfg.

Выпуск самоподписанного сертификата CA

Самоподписанный корневой сертификат нам нужен для того, чтобы выдать пользовательский сертификат по запросу, полученному ранее.

Сначала создадим ключ CA:

Code Block
openssl genpkey -engine pkcs11_gost -algorithm GOST2001 -pkeyopt key_id:1000 -pkeyopt paramset:A -pkeyopt pin:12345678

Затем выпустим самоподписанный сертификат:

Code Block
openssl req -engine pkcs11_gost -x509 -new -key 1000 -keyform engine -out ca.crt 

Выпуск пользовательского сертификата по запросу

  • в папке установки OpenSSL/bin создадим папку demoCA
  • в папке demoCA создадим папку newcerts
  • в папке demoCA создадим пустой файл index.txt и файл serial (без расширения)
  • в файле serial напишем 01. Это позволит нам вести учет выданных сертификатов.

Затем выпустим сертификат:

Code Block
openssl ca -engine pkcs11_gost -keyfile 1000 -keyform engine -cert ca.crt -in req.csr -out tester.crt

Выработка "присоединенной" подписи данных в различных форматах

в формате S/MIME:

Code Block
openssl smime -engine pkcs11_gost -sign -in data.file -out data.sig -nodetach -binary -signer tester.crt -inkey 50 -keyform engine

в формате PKCS#7:

Code Block
openssl smime -engine pkcs11_gost -sign -in  data.file -out data.sig -nodetach -binary -signer tester.crt -inkey 50 -keyform engine -outform PEM

в формате CMS:

Code Block
openssl cms -engine pkcs11_gost -sign -in data.file -out data.sig -nodetach -binary -signer tester.crt -inkey 50 -keyform engine -outform PEM

Для того, чтобы подписать файл “отсоединенной” подписью уберите ключ -nodetach.

Проверка "присоединенной" подписи в различных форматах

в формате S/MIME:

Code Block
openssl smime -engine pkcs11_gost -verify -in data.sig -inform SMIME -CAfile ca.crt -out data.file

в формате PKCS#7:

Code Block
openssl smime -engine pkcs11_gost -verify -in data.sig -inform PEM -CAfile ca.crt -out data.file

в формате CMS:

Code Block
openssl cms -engine pkcs11_gost -verify -in data.sig -inform PEM -CAfile ca.crt -out data.file

"Сырая" подпись данных по ГОСТ Р 34.10-2001

Code Block
openssl dgst -engine pkcs11_gost -md_gost94 -sign 50 -keyform engine data.file 

Шифрование в формате CMS

При шифровании производится выработка эфемерной ключевой пары на токене, поэтому требуется авторизоваться на устройстве. Для этой цели в секцию конфигурационного файла:

Code Block
[pkcs11_section]
engine_id = dynamic
dynamic_path = C:/openssl/engines/pkcs11_gost.dll
MODULE_PATH = C:/openssl/engines/rtPKCS11ECP.dll
PIN = 12345678
init = 0
default_algorithms = ALL
следует добавить опцию PIN, в которой указать PIN-код к устройству.

 

Code Block
openssl smime -engine pkcs11_gost -encrypt -binary -gost89 -in data.file -out data.enc respondent_gost.crt

Здесь respondent_gost.crt - сертификат адресата, для которого шифруется сообщение.

Расшифрование на стороне адресата:

Code Block
openssl smime -decrypt -engine gost -in data.enc -recip respondent_gost.crt -inkey respondent_gost.key -out data.file