OpenSC не может соединить javacard с апплетом PKCS - PullRequest
0 голосов
/ 01 сентября 2018

У меня пустая смарт-карта JavaCOS A40 и я хочу сделать ее PKI-картой PKCS.

Я собираюсь использовать его как ключ ssh и для подписания электронных контрактов. Россия не предоставляет e-id для смарт-карт гражданам, как это делают страны ЕС. Коммерческие провайдеры электронной подписи продают какие-то защищенные паролем USB-накопители, которые небезопасны в использовании, поскольку вы можете легко экспортировать закрытый ключ. Также они продают обычные смарт-карты, но они действительно дорогие (х10-х20, чем пустой javacard) и недолговечные (около 1 года). Поэтому я хочу сделать свою собственную карту PKI на основе алгоритмов RSA из javacard.

Теперь мой javacard находится в состоянии OP_READY, и я не изменил его, потому что изменения необратимы. Он использует ключ по умолчанию, и каждый может загрузить что угодно. Я использую ACR38U ридер с pcsc драйвером linux для Ubuntu, и он работает как положено, поэтому я использовал GlobalPlatformPro для загрузки PKI IsoApplet по умолчанию. Таким образом, вывод GP:

java -jar gp.jar -list
Warning: no keys given, using default test key 404142434445464748494A4B4C4D4E4F
ISD: A000000003000000 (OP_READY)
     Privs:   SecurityDomain, CardLock, CardTerminate, CardReset, CVMManagement

APP: F276A288BCFBA69D34F31001 (SELECTABLE)
     Privs:   CardReset

PKG: F276A288BCFBA69D34F310 (LOADED)
     Version: 1.0
     Applet:  F276A288BCFBA69D34F31001

cardpeek успешно подключается к нему, и я могу отправлять низкоуровневые команды апплету cardpeek

Но когда я пытаюсь подключиться к карте и апплету, используя пробер opensc, чтобы увидеть ответ на запрос (ATR), происходит сбой opensc-tool --reader 0 --atr. См. Максимальную отладочную информацию

Укороченная версия:

opensc-tool --reader 0 --atr -vv
Connecting to card in reader ACS ACR 38U-CCID 00 00...
0x7fc849e7e740 22:17:14.634 [opensc-tool] card.c:200:sc_connect_card: called
0x7fc849e7e740 22:17:14.634 [opensc-tool] card-entersafe.c:138:entersafe_match_card: called
Failed to connect to card: Card command failed
0x7fc849e7e740 22:17:14.797 [opensc-tool] ctx.c:870:sc_release_context: called

Согласно информации производителя, карта поддерживает T=0 по ISO7816, но opensc пытается связаться с T=1. Так как я могу это исправить?

Кажется, что инструменты opensc не настраиваются. Мне нужно использовать pkcs15-crypt, но он не может подключиться. Могу ли я изменить драйверы, перекомпилировать opensc с патчами или использовать другую утилиту? Как еще можно использовать, например, для работы с OpenPGP?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

IsoApplet и OpenPGP - это два разных мира. Для поддержки OpenPGP посмотрите на SmartPGP от ANSSI-FR на github или ykneo-openpgp (также на Github).

Для подписей вам также не нужен pkcs15-crypt, но он должен работать через библиотеку PKCS # 11.

По этой конкретной причине - карта, соответствующая epass, отключает драйвер epass в opensc.conf.

0 голосов
/ 21 сентября 2018

Ваша проблема, конечно, не в транспортном протоколе, потому что он связывает APDU с картой. При просмотре журнала кажется, что ATR неправильно догадывается, что карта является epass2003:

0x7f175a21e740 22:14:13.904 [opensc-tool] card.c:287:sc_connect_card: matched: epass2003

затем выполните команду к нему:

0x7f175a21e740 22:14:13.904 [opensc-tool] apdu.c:378:sc_single_transmit: CLA:0, INS:CA, P1:1, P2:86, data(0) (nil)
0x7f175a21e740 22:14:13.904 [opensc-tool] reader-pcsc.c:283:pcsc_transmit: reader 'ACS ACR 38U-CCID 00 00'
0x7f175a21e740 22:14:13.904 [opensc-tool] reader-pcsc.c:284:pcsc_transmit: 
Outgoing APDU (5 bytes):
00 CA 01 86 00 .....
0x7f175a21e740 22:14:13.904 [opensc-tool] reader-pcsc.c:212:pcsc_internal_transmit: called
0x7f175a21e740 22:14:13.912 [opensc-tool] reader-pcsc.c:293:pcsc_transmit: 
Incoming APDU (2 bytes):
6D 00 m.
0x7f175a21e740 22:14:13.912 [opensc-tool] apdu.c:390:sc_single_transmit: returning with: 0 (Success)
0x7f175a21e740 22:14:13.912 [opensc-tool] apdu.c:543:sc_transmit: returning with: 0 (Success)
0x7f175a21e740 22:14:13.912 [opensc-tool] card.c:459:sc_unlock: called
0x7f175a21e740 22:14:13.912 [opensc-tool] reader-pcsc.c:662:pcsc_unlock: called
0x7f175a21e740 22:14:13.921 [opensc-tool] card-epass2003.c:189:epass2003_check_sw: Instruction code not supported or invalid
0x7f175a21e740 22:14:13.921 [opensc-tool] card-epass2003.c:1118:get_data: get_data failed: -1204 (Unsupported INS byte in APDU)

Теперь эта команда выполняется по каналу связи при T = 1 (очень маловероятно, что карта просто поддерживает T = 0, если она также поддерживает T = CL, потому что T = CL и T = 1 очень похожи - при более высокий уровень). Мало того, он корректно возвращает результат, даже если это более высокий уровень условие ошибки: 6D00 означает, что инструкция не поддерживается.

Это приводит к состоянию ошибки высокого рычага:

Failed to connect to card: Card command failed

, что немного вводит в заблуждение, поскольку он, безусловно, подключил к карте, просто не смог получить от нее никаких данных с помощью команды GET DATA. Это не так уж странно, потому что он сначала не выбрал ни одного апплета, и GET DATA (с INS-truction CA) вряд ли будет присутствовать в корневой папке / апплете.

TL; DR с вашим соединением все в порядке, теперь начните программировать его, введя ему команды диспетчера карт GlobalPlatform. Если возможно, используйте другой инструмент или получите инструменты opensc, чтобы пропустить этап идентификации / начальные команды для него.

...