Идентификация закрытого ключа в библиотеке 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
Просто убедитесь, что вы импортируете сертификат с тем же идентификатором, что и идентификатор закрытого ключа.