Идентификация закрытого ключа в библиотеке Pkcs11Interop.PDF

Я пытаюсь настроить пример приложения с расширением Pkcs11Interop.PDF. Я к сожалению получаю System.ArgumentNullException установка CKAID. Что будет работать здесь? Я пробовал разные номера здесь, которые все дали мне System.ArgumentOutOfRangeException,

Программа установки использует приложение VirtualCryptoki-64-1.0.6.7.exe для имитации смарт-карты.

Тревожный звонок:

pkcs11RsaSignature = new Pkcs11RsaSignature(libraryPath, tokenSerial, tokenLabel, pin, ckaLabel, ckaId, hashAlgorithm);

Я использую алгоритм хэширования:

HashAlgorithm hashAlgorithm = HashAlgorithm.SHA256;

Обновление после использования pkcs11-tool:

Содержимое виртуальной карты:

    C:\Program Files\OpenSC Project\OpenSC\tools>pkcs11-tool.exe --module "C:\windows\System32\vcki.dll" --list-slots --list-objects --login --pin 1234
Available slots:
Slot 0 (0xd47db04d): Virtual Smart Card Reader
  token label:   Virtual SC-A0101010101
  token manuf:   Cryptware
  token model:   VirtualSmartCard
  token flags:   rng, login required, PIN initialized, token initialized, other flags=0x200
  serial num  :
Using slot 0 with a present token (0xd47db04d)
Certificate Object, type = X.509 cert
  label:      ibisit
  ID:         4a656e73204b6175666d616e6e
Public Key Object; RSA 1024 bits
  label:      ibisit
  ID:         4a656e73204b6175666d616e6e
  Usage:      encrypt, verify
Private Key Object; RSA
  label:      ibisit
  ID:         4a656e73204b6175666d616e6e
  Usage:      decrypt, sign
warning: PKCS11 function C_GetAttributeValue(ALWAYS_AUTHENTICATE) failed: rv = CKR_ATTRIBUTE_TYPE_INVALID (0x12)

Public Key Object; RSA 1024 bits
  label:      ibisit
  ID:         4a656e73204b6175666d616e6e
  Usage:      encrypt, verify
Private Key Object; RSA
  label:      ibisit
  ID:         4a656e73204b6175666d616e6e
  Usage:      decrypt, sign
warning: PKCS11 function C_GetAttributeValue(ALWAYS_AUTHENTICATE) failed: rv = CKR_ATTRIBUTE_TYPE_INVALID (0x12)

Параметры, которые я использую:

string libraryPath = @"C:\Windows\System32\vcki.dll";
string tokenSerial = null;
string tokenLabel = @"Virtual SC-A0101010101";
string pin = @"1234";
string ckaLabel = @"ibisit";
string ckaId = "4a656e73204b6175666d616e6e";
HashAlgorithm hashAlgorithm = HashAlgorithm.SHA256;

Я, к сожалению, получаю Net.Pkcs11Interop.PDF.ObjectNotFoundException установка CKAID. Изменение пин-кода дает мне другое исключение, поэтому я определенно получаю доступ к нужному устройству здесь.

Обновление после перехода на SoftHSM: jariq заявил, что здесь слишком много объектов с одинаковым идентификатором. К сожалению, Virtual Key Explorer не позволил мне удалить какой-либо объект, поэтому я переключился на SoftHSM (который я использовал в начале). Я получаю "Сертификат с меткой"ibis-it key"и идентификатор"A1B2"не найден". Я предполагаю, что проблема здесь в том, что эта виртуальная карта содержит только пару ключей RSA, а не сертификат.

Выходные данные инструмента pkcs11:

C:\Program Files (x86)\OpenSC Project\OpenSC\tools>pkcs11-tool.exe --module "C:\SoftHSM\lib\libsofthsm.dll" --list-slots --list-objects --login --pin smart
Available slots:
Slot 0 (0x0): SoftHSM
  token label:   SoftHSM
  token manuf:   SoftHSM
  token model:   SoftHSM
  token flags:   rng, login required, PIN initialized, token initialized, other flags=0x40
  serial num  :  1
Using slot 0 with a present token (0x0)
Public Key Object; RSA 2048 bits
  label:      ibis-it key
  ID:         a1b2
  Usage:      verify
Private Key Object; RSA
  label:      ibis-it key
  ID:         a1b2
  Usage:      sign

Проблема в том, что SoftHSM импортирует только пары ключей PKCS#8 (RSA), поэтому здесь никогда не будет сертификата. Я полагаю, вы использовали его с парами ключей RSA, но не с сертификатами.

1 ответ

Решение

Параметры, передаваемые в конструктор класса Net.Pkcs11Interop.PDF.Pkcs11RsaSignature, определяют следующие вещи:

  • какую библиотеку PKCS#11 следует использовать (libraryPath)
  • какой токен / смарт-карта хранит закрытый ключ (tokenSerial и / или tokenLabel)
  • какой закрытый ключ следует использовать для подписи (ckaLabel и / или ckaId)
  • какой алгоритм хеширования следует использовать при создании подписи (hashAlgorithm)

Если вы знаете, какую библиотеку PKCS#11 следует использовать для доступа к смарт-карте, вы можете определить правильные значения для остальных параметров, например, запустив утилиту pkcs11-tool, которая входит в состав промежуточного программного обеспечения OpenSC. Ниже приведена точная команда и выходные данные, сгенерированные для моей тестовой карты (важные части выделены жирным шрифтом):

C: \ Program Files (x86) \ OpenSC Project \ OpenSC \ tools> pkcs11-tool.exe --module cardos11.dll - список-слотов - список-объектов --login --pin 11111111
Доступные слоты:
Слот 0 (0x1): SCM Microsystems Inc. Устройство чтения смарт-карт USB SCR33x 0
  метка токена: Pkcs11Interop
  производитель токенов: www.atos.net/cardos
  Модель токена: CardOS V4.3B
  флаги токена: rng, требуется логин, инициализирован PIN-код, инициализирован токен, другие флаги =0x800
  версия аппаратного обеспечения: 102.63
  версия прошивки: 200.8
  серийный номер: 7BFF2737350B262C Использование слота 0 с текущим токеном (0x1)
Объект закрытого ключа; RSA
  ярлык: Джон Доу
  ID:         ec5e50a889b888d600c6e13cb0fdf0c1
  Использование: знак
Объект сертификата, тип = сертификат X.509
  ярлык: Джон Доу
  ID:         ec5e50a889b888d600c6e13cb0fdf0c1

На основании этого вывода это правильные значения отдельных параметров для этой карты:

  • libraryPath = "cardos11.dll"
  • tokenSerial = "7BFF2737350B262C" и / или tokenLabel = "Pkcs11Interop"
  • ckaLabel = "Джон Доу" и / или ckaId="ec5e50a889b888d600c6e13cb0fdf0c1"

Надеюсь это поможет.

Обновление для исключения ObjectNotFoundException:

Вы получаете ObjectNotFoundException, потому что в вашем токене хранятся два закрытых ключа с точно такой же меткой и идентификатором, и поэтому класс Pkcs11RsaSignature не может быть уверен, какой из них следует использовать для создания подписи. Просто удалите или переименуйте один из них, и он должен работать.

Обновление для SoftHSM:

Вы можете импортировать закрытый ключ PKCS#8 в SoftHSM с помощью инструмента softhsm.exe:

C:\SoftHSM\bin>softhsm.exe --import doe.key --slot 0 --label "John Doe" --pin 11111111 --id "ec5e50a889b888d600c6e13cb0fdf0c1"
The key pair has been imported to the token in slot 0.

Вы можете импортировать закодированный DER сертификат X.509 в SoftHSM с помощью инструмента pkcs11-tool.exe:

C:\SoftHSM\bin>"c:\Program Files (x86)\OpenSC Project\OpenSC\tools\pkcs11-tool.exe" --module libsofthsm.dll --login --pin 11111111 --write-object doe.der --type cert --label "John Doe" --id "ec5e50a889b888d600c6e13cb0fdf0c1"
Using slot 0 with a present token (0x0)
Created certificate:
Certificate Object, type = X.509 cert
  label:      John Doe
  ID:         ec5e50a889b888d600c6e13cb0fdf0c1

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

Другие вопросы по тегам