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, вход в госуслуги заработал, при этом работа через КриптоПРО не сломалась. Спасибо.

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

Наткнулся на такую же проблему. Работает всё, кроме Госуслуг, но у меня, похоже, не обнаруживается ключ, в логах

2024-01-18 22:33:12:WEBLIB:process_request:Response string(length = 341) = "{"error_code":0,"ifc_list":[{"alg":"gost2001","alias":"ruTokenECP","description":"Aktiv Rutoken ECP - CP 00 00","model":"Rutoken ECP","name":"Рутокен РЦП","num":"0","path":"/opt/aktivco/rutokenecp/x86_64/librtpkcs11ecp.so","serial_number":"41757920","skip_pkcs11_list":"","type":"pkcs11"}],"ifc_list_length":1}"
2024-01-18 22:33:12:WEBLIB:process_request:Request string(length = 111) = "{"func_name":"get_list_certs_by_cryptoid_array","params":{"cryptoID_array":["ruTokenECP/0"],"show_progress":0}}"
2024-01-18 22:33:12:IFC:ifc_get_list_certs:STARTED
2024-01-18 22:33:12:IFC:ifc_engine:STARTED
2024-01-18 22:33:12:IFC:ifc_init_pkcs11_engine:STARTED
2024-01-18 22:33:12:IFC:ifc_init_pkcs11_engine:p11 lib name: /opt/aktivco/rutokenecp/x86_64/librtpkcs11ecp.so, slot: 0, engine lib name: pkcs11_engine
2024-01-18 22:33:12:IFC:ifc_load_pkcs11_lib:STARTED
2024-01-18 22:33:12:IFC:ifc_load_pkcs11_lib:module path: /opt/aktivco/rutokenecp/x86_64/librtpkcs11ecp.so
2024-01-18 22:33:12:IFC:ifc_load_pkcs11_lib:cached PKCS#11 library found
2024-01-18 22:33:12:IFC:ifc_load_pkcs11_lib:C_Initialize already initialized
2024-01-18 22:33:12:IFC:ifc_load_pkcs11_lib:result [0]
2024-01-18 22:33:12:IFC:get_slot_and_token_info:STARTED
2024-01-18 22:33:12:IFC:get_slot_and_token_info:GetSlotInfo [0]
2024-01-18 22:33:12:IFC:get_slot_and_token_info:Slot description: "Aktiv Rutoken ECP - CP 00 00"
2024-01-18 22:33:12:IFC:get_slot_and_token_info:C_GetTokenInfo [0]
2024-01-18 22:33:12:IFC:get_slot_and_token_info:Token Serial Number: "41757920"
2024-01-18 22:33:12:IFC:get_slot_and_token_info:Token Model: "Rutoken ECP"
2024-01-18 22:33:12:IFC:get_slot_and_token_info:result [0]
2024-01-18 22:33:12:IFC:check_token_support:STARTED
2024-01-18 22:33:12:IFC:check_token_support:result [0]
2024-01-18 22:33:12:IFC:load_pkcs11_engine:STARTED
2024-01-18 22:33:12:IFC:load_pkcs11_engine:engine_path: pkcs11_engine
2024-01-18 22:33:12:IFC:load_pkcs11_engine:dynamic engine was loaded
2024-01-18 22:33:12:IFC:load_pkcs11_engine:engine library name was set to pkcs11_engine
2024-01-18 22:33:12:IFC:load_pkcs11_engine:engine ID was set to pkcs11_engine-ruTokenECP-0
2024-01-18 22:33:12:IFC:load_pkcs11_engine:engine was loaded
2024-01-18 22:33:12:IFC:load_pkcs11_engine:pkcs11 functions list was set
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:open_session:open_session STARTED
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:check_if_token_in_slot_and_set_slot_and_token_info_to_ctx:STARTED
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:check_if_token_in_slot_and_set_slot_and_token_info_to_ctx:PASSED
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:open_session:ctx->slot_id = 0  ctx->sess_flags = 6
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:open_session:PASSED
2024-01-18 22:33:12:IFC:load_pkcs11_engine:pkcs11 session was opened
2024-01-18 22:33:12:IFC:pkcs11_engine_login:STARTED
2024-01-18 22:33:12:IFC:pkcs11_engine_login:user pin is NULL
2024-01-18 22:33:12:IFC:pkcs11_engine_login:result [0]
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:set_sign_oid:STARTED
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:set_sign_oid:PASSED
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:set_hash_oid:STARTED
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:set_hash_oid:PASSED
2024-01-18 22:33:12:IFC:load_pkcs11_engine:result [0]
2024-01-18 22:33:12:IFC:ifc_init_pkcs11_engine:result [0]
2024-01-18 22:33:12:IFC:ifc_engine:result [0]
2024-01-18 22:33:12:IFC:ifc_list_certificates_in_store:STARTED
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:gost_store_list_start:STARTED
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:gost_store_list_start:PASSED
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:gost_store_list_next:STARTED
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:gost_store_list_next:No such objects
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:gost_store_list_next:PASSED
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:gost_store_list_end:STARTED
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:gost_store_list_end:PASSED
2024-01-18 22:33:12:IFC:ifc_list_certificates_in_store:result [0]
2024-01-18 22:33:12:IFC:ifc_get_list_certs:result [0]
2024-01-18 22:33:12:WEBLIB:process_request:Response string(length = 77) = "{"error_code":0,"result_array":[{"cert_list":[],"crypto_id":"ruTokenECP/0"}]}"

Меня несколько смущает вот это

2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:gost_store_list_next:STARTED
2024-01-18 22:33:12:pkcs11_engine-ruTokenECP-0:gost_store_list_next:No such objects

pkcs11-tool при этом ключ видит

 pkcs11-tool --module /opt/aktivco/rutokenecp/x86_64/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; GOSTR3410-2012-512
  PARAMS OID: 06092a8503070102010201
  VALUE:      18a3470d3fbbfac617140ac347de3a91722a7c9371986ec87ab08e2a16346dfe
              7d28681b885371026f63c19c3950b03901b0765eb9881b7373b1e15d80576f96
              5de4517a917deb7c752540c0958aa0e4924ae5dd50e68af91d228a04ed7a091b
              1509c0690b5d3fbf1091a66febb47cd4afa9f7959f267e1eb4e92a98e0b1476a
  label:      ray
  ID:         04556e8e87e4a2e11a4212918012993ac3fb41dc
  Usage:      verify
  Access:     local
Private Key Object; GOSTR3410-2012-512
  PARAMS OID: 06092a8503070102010201
  label:      ray
  ID:         04556e8e87e4a2e11a4212918012993ac3fb41dc
  Usage:      sign
  Access:     sensitive, always sensitive, never extractable, local
Data object 3263248665
  label:          'ray'
  application:    'CryptoPro CSP'
  app_id:         <empty>
  flags:           modifiable

КриптоПро тоже всё видит, и в других местах всё работает, как положено.
Куда ещё можно посмотреть?

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

Добрый день, rayslava,

Уточните, пожалуйста, какую модель Рутокен вы используете? Рутокен ЭЦП 2.0, Рутокен ЭЦП 3.0 или Рутокен TLS?

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

У меня Рутокен ЭЦП 3.0 3100 NFC

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

Добрый день, rayslava,

Необходимо проверить, что объекты видны через библиотеку, которая входит в состав Плагина Госуслуг командой:
pkcs11-tool --module /usr/lib/mozilla/plugins/lib/librtpkcs11ecp.so -O -l
если объекты не будут отображаться, необходимо заменить эту библиотеку той, что находится по пути /opt/aktivco/rutokenecp/x86_64/librtpkcs11ecp.so

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

Проверил, работает:

$ pkcs11-tool --module /usr/lib/mozilla/plugins/lib/librtpkcs11ecp.so -O -l                                                                                                                                                                                                                                                 
Using slot 0 with a present token (0x0)
Logging in to "Rutoken ECP <no label>".
Please enter User PIN: 
Public Key Object; GOSTR3410-2012-512
  PARAMS OID: 06092a8503070102010201
  VALUE:      18a3470d3fbbfac617140ac347de3a91722a7c9371986ec87ab08e2a16346dfe
              7d28681b885371026f63c19c3950b03901b0765eb9881b7373b1e15d80576f96
              5de4517a917deb7c752540c0958aa0e4924ae5dd50e68af91d228a04ed7a091b
              1509c0690b5d3fbf1091a66febb47cd4afa9f7959f267e1eb4e92a98e0b1476a
  label:      ray
  ID:         04556e8e87e4a2e11a4212918012993ac3fb41dc
  Usage:      verify
  Access:     local
Private Key Object; GOSTR3410-2012-512
  PARAMS OID: 06092a8503070102010201
  label:      ray
  ID:         04556e8e87e4a2e11a4212918012993ac3fb41dc
  Usage:      sign
  Access:     sensitive, always sensitive, never extractable, local
Data object 2182990817
  label:          'ray'
  application:    'CryptoPro CSP'
  app_id:         <empty>
  flags:           modifiable

Но и по логам ifc плагин использует библиотеку из /opt/akivco:

2024-01-22 14:09:01:IFC:ifc_init_pkcs11_engine:p11 lib name: /opt/aktivco/rutokenecp/x86_64/librtpkcs11ecp.so, slot: 0, engine lib name: pkcs11_engine