IFCPlugin не работает с PKCS#11 библиотекой Рутокен

При авторизации на госуслугах плагин не видит открытый ключ через библиотеку PKCS#11 Рутокен.

Настройки в /etc/ifc.cfg

log = {
   level = "DEBUG";
}

config = {
    cert_from_registry = "false";
    set_user_pin = "false";
}

params =
(
  { name  = "CryptoPro CSP";
    alias = "cprocsp";
    type  = "pkcs11";
    alg   = "gost2001";
    model = "CPPKCS 3";
    lib_linux   = "/opt/cprocsp/lib/amd64/libcppkcs11.so";
  },


  { name  = "Актив руТокен ЭЦП";
    alias = "ruTokenECP";
    type  = "pkcs11";
    alg   = "gost2001";
    model = "Rutoken ECP";
    lib_win   = "rtpkcs11ecp.dll";
    lib_linux = "librtpkcs11ecp.so";
    lib_mac   = "librtpkcs11ecp.dylib";
  }
);

Если закомментировать криптопро, то логи плагина /var/log/ifc/engine_logs/engine.log выглядят вот так: https://gist.github.com/olegshtch/72d88 … fc31a18b53

С библиотекой PKCS#11 ключ находится, и авторизация проходит успешно:

2022-11-23 23:20:17:IFC:ifc_list_certificates_in_store:STARTED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:gost_store_list_start:STARTED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:gost_store_list_start:PASSED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:gost_store_list_next:STARTED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:make_object_to_return:STARTED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:make_x509_by_handle:STARTED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:make_x509_by_handle:PASSED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:make_object_to_return:PASSED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:gost_store_list_next:PASSED
2022-11-23 23:20:17:IFC:ifc_list_certificates_in_store:cert ID [24B61DAD984E3AE8]
2022-11-23 23:20:17:IFC:ifc_list_certificates_in_store:check a public key for found cert ID
2022-11-23 23:20:17:IFC:get_pub_key_by_id:STARTED
2022-11-23 23:20:17:IFC:get_pub_key_by_id:ID to find: 24B61DAD984E3AE8
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:gost_store_list_start:STARTED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:gost_store_list_start:PASSED
2022-11-23 23:20:17:IFC:get_pub_key_by_id:STORE_list_publice_key_start done
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:gost_store_list_next:STARTED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:make_object_to_return:STARTED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:make_pkey_by_pub_key_handle:STARTED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:get_pub_key_value_and_sign_oid_and_hash_oid_by_handle:STARTED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:get_pub_key_value_and_sign_oid_and_hash_oid_by_handle:PASSED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:make_pkey_by_pub_key_handle:PASSED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:make_object_to_return:PASSED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:gost_store_list_next:PASSED
2022-11-23 23:20:17:IFC:get_pub_key_by_id:STORE_list_public_key_next done
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:gost_store_list_end:STARTED
2022-11-23 23:20:17:pkcs11_engine-cprocsp-0:gost_store_list_end:PASSED
2022-11-23 23:20:17:IFC:get_pub_key_by_id:STORE_list_public_key_end done
2022-11-23 23:20:17:IFC:get_pub_key_by_id:result [found key handle]
2022-11-23 23:20:17:IFC:ifc_list_certificates_in_store:public key was found

При этом ключи и сертификаты видны через каждую библиотеку:

$ pkcs11-tool --module /opt/cprocsp/lib/amd64/libcppkcs11.so -O --login
Using slot 0 with a present token (0x0)
Logging in to "CryptoPro Token".
Please enter User PIN: 
Private Key Object; GOSTR3410-2012-256
  PARAMS OID: 06072a850302022400
  label:      Shelykalnov_Oleg_Urevich_1669138159386
  ID:         32344236314441443938344533414538
  Usage:      decrypt, sign, unwrap, derive
warning: PKCS11 function C_GetAttributeValue(ALWAYS_AUTHENTICATE) failed: rv = CKR_ATTRIBUTE_TYPE_INVALID (0x12)

  Access:     extractable
Public Key Object; GOSTR3410-2012-256
  PARAMS OID: 06072a850302022400
  VALUE:      24b61dad984e3ae8899ac9016320b5faa379e5b681636744f27ee65a7aaea77a
              3d0472d1479bf76b4931453a4751ee38abb01d3bb1b39e546718a7f0bd02472e
  label:      Shelykalnov_Oleg_Urevich_1669138159386
  ID:         32344236314441443938344533414538
  Usage:      encrypt, verify, wrap, derive
  Access:     none
Certificate Object; type = X.509 cert
  label:      Shelykalnov_Oleg_Urevich_1669138159386
  subject:    DN: emailAddress=olegshtch@yandex.ru/SNILS=...
  ID:         32344236314441443938344533414538
Object 3221225476, type 3461563219
$ pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O --login 
Using slot 0 with a present token (0x0)
Logging in to "Rutoken ECP <no label>".
Please enter User PIN: 
Public Key Object; EC  EC_POINT 256 bits
  EC_POINT:   0441044a05c87131a0e03bb1eb21967b7d8ba8887c1c4994fc47e4aa0b091c008d2c0a6e8a11870ae325d4851fc9ea04dcc7f61b2c38ef6fcd533ab1fb2592e2c1d32f
  EC_PARAMS:  06082a8648ce3d030107
  label:      SSH
  ID:         99
  Usage:      verify
  Access:     local
Private Key Object; EC
  label:      SSH
  ID:         99
  Usage:      sign
  Access:     sensitive, always sensitive, never extractable, local
Public Key Object; GOSTR3410-2012-256
  PARAMS OID: 06072a850302022400
  VALUE:      24b61dad984e3ae8899ac9016320b5faa379e5b681636744f27ee65a7aaea77a
              3d0472d1479bf76b4931453a4751ee38abb01d3bb1b39e546718a7f0bd02472e
  label:      Shelykalnov_Oleg_Urevich_1669138159386
  ID:         5368656c796b616c6e6f765f4f6c65675f557265766963685f3136363931333831353933383600
  Usage:      verify
  Access:     local
Private Key Object; GOSTR3410-2012-256
  PARAMS OID: 06072a850302022400
  label:      Shelykalnov_Oleg_Urevich_1669138159386
  ID:         5368656c796b616c6e6f765f4f6c65675f557265766963685f3136363931333831353933383600
  Usage:      sign, derive
  Access:     sensitive, always sensitive, never extractable, local
Data object 3262127904
  label:          'Shelykalnov_Oleg_Urevich_1669138159386'
  application:    'CryptoPro CSP'
  app_id:         <empty>
  flags:           modifiable
Certificate Object; type = X.509 cert
  label:      Rutoken Plugin
  subject:    DN: emailAddress=olegshtch@yandex.ru/SNILS=...
  ID:         5368656c796b616c6e6f765f4f6c65675f557265766963685f3136363931333831353933383600

Я сначала предположил, что это разные ключи и приложение создания сертификата создало аппаратный и программный ключ, но на ra.rutoken.ru сертификат привязан к ключу, и подпись, сделанная на нём, успешно проверяется через госуслуги.

Re: IFCPlugin не работает с PKCS#11 библиотекой Рутокен

OlegShtch, Добрый день.
Каким образом вы создавали ключи и сертификаты?

Re: IFCPlugin не работает с PKCS#11 библиотекой Рутокен

С помощью приложения от ITcom, выбрав рутокен и pkcs11 режим в КриптоПРО.

Re: IFCPlugin не работает с PKCS#11 библиотекой Рутокен

OlegShtch, какая версия КриптоПро при этом использовалась?

(2022-11-24 14:47:03 отредактировано OlegShtch)

Re: IFCPlugin не работает с PKCS#11 библиотекой Рутокен

Версия КриптоПро 5.0.12500

Попробовал добавить тестовый ключ без сертификата с ra.rutoken.ru. Рутокен PKCS#11 видит и публичный, и приватный ключи:

Public Key Object; GOSTR3410-2012-256
  PARAMS OID: 06072a850302022301
  VALUE:      0ab1930d0909dd6a2d9f5ffcca49d15a4a900eb87f0656c5e6a1fce1190a797d
              8654951513eacf55714baa31d1093ad76bad8d27a033d522c8f78ac183a4c8a1
  label:      
  ID:         54657374
  Usage:      verify
  Access:     local
Private Key Object; GOSTR3410-2012-256
  PARAMS OID: 06072a850302022301
  label:      
  ID:         54657374
  Usage:      sign, derive
  Access:     sensitive, always sensitive, never extractable, local

КриптоПро PKCS#11 видит только приватный ключ:

Private Key Object; GOSTR3410-2012-256
  PARAMS OID: 06072a850302022301
  label:      ID_54657374
  ID:         30414231393330443039303944443641
  Usage:      decrypt, sign, unwrap, derive
warning: PKCS11 function C_GetAttributeValue(ALWAYS_AUTHENTICATE) failed: rv = CKR_ATTRIBUTE_TYPE_INVALID (0x12)

  Access:     extractable

Если добавить тестовый сертификат, то КриптоПро его всё равно не видит.

Re: IFCPlugin не работает с PKCS#11 библиотекой Рутокен

Скорее всего дело в библиотеке libcppkcs11.so. В Плагине для Госуслуг может использоваться устаревшая версия, которая не полностью совместима по формату с rtpkcs11ecp.so
Начиная с КриптоПро 5.0 R2 для работы с ключами формата PKCS#11 используется наша библиотека rtpkcs11ecp.so.
У вас конечная цель какая? Войти в Госуслуги с помощью ключей формата PKCS#11?

Re: IFCPlugin не работает с PKCS#11 библиотекой Рутокен

Аверченко Кирилл пишет:

У вас конечная цель какая? Войти в Госуслуги с помощью ключей формата PKCS#11?

Скорее войти в Госуслуги без КриптоПро.

Re: IFCPlugin не работает с PKCS#11 библиотекой Рутокен

Добрый день!

Если промежуточная цель -- выяснить, почему через rtpkcs11ecp не работает, предлагаю снять логи через pkcs11-spy по этой инструкции: https://dev.rutoken.ru/pages/viewpage.a … d=19496963

Я подозреваю, проблема в том, что в атрибуте CKA_ID (в выводе pkcs11-tool это "ID") в конце присутствует байт 0x00, который впоследствии теряется при запросе поиска ключа.

Не могли бы сформировать ключи на ra.rutoken.ru (и там же импортировать сертификат) и приложить логи, аналогичные логам тут (https://gist.github.com/olegshtch/72d88 … fc31a18b53), и вывод pkcs11-tool заодно?

Re: IFCPlugin не работает с PKCS#11 библиотекой Рутокен

Добавил логи с pkcs11-spy https://gist.github.com/olegshtch/72d88 … fc31a18b53

Да, похоже на то, сертификат возвращается с 0x00 на конце, а публичный ключ ищется без него.

Re: IFCPlugin не работает с PKCS#11 библиотекой Рутокен

С помощью --set-id убрал 0x00 с конца ID, вход в госуслуги заработал, при этом работа через КриптоПРО не сломалась. Спасибо.