我有空JavaCOS A40智能卡并希望将其设为 PKCS PKI 卡。
我将使用它作为 ssh key 并用于签署电子契约(Contract)。俄罗斯不像欧盟国家那样为公民提供基于智能卡的电子身份证。商业电子签名提供商正在销售某种受密码保护的 USB 驱动器,但使用起来不安全,因为您可以轻松导出私钥。他们也卖普通的智能卡,但它们真的很贵(比空的 javacard 贵 10-x20)而且生命周期短(大约 1 年)。所以我想基于 javacard 的 RSA 算法制作自己的 PKI 卡。
现在我的 javacard 处于状态 OP_READY
并且我没有更改它,因为更改是不可逆的。它使用默认 key ,任何人都可以上传任何内容。我在 Ubuntu
上使用 ACR38U
阅读器和 pcsc
linux 驱动程序,它按预期工作,所以我使用了 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
但是当我尝试使用 opensc
探测器连接到卡和小程序以查看请求应答 (ATR) 时,它失败 opensc-tool --reader 0 --atr
。 See maximum debug info
缩短版本:
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
根据制造商信息,卡支持 ISO7816 上的 T=0
,但 opensc 尝试与 T=1
通信。那么我该如何解决这个问题呢?
看来 opensc 工具是不可定制的。我需要使用 pkcs15-crypt
,但无法连接。我可以更改驱动程序、使用补丁重新编译 opensc 或使用其他实用程序吗?例如,我可以使用哪些其他方式来使用 OpenPGP?
最佳答案
您的问题肯定不在于传输协议(protocol),因为它与卡通信 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 的通信 channel 上执行(如果卡也支持 T=CL,那么它不太可能只支持 T=0,因为 T=CL 和 T=1 非常相似 - 在更高级别)。不仅如此,它还能正确返回结果,即使这是更高级别错误条件:6D00 表示不支持指令。
这会导致高杠杆错误条件:
Failed to connect to card: Card command failed
这有点误导,因为它确实连接到卡,只是无法使用 GET DATA 命令从中获取任何数据。这并不奇怪,因为它没有首先选择任何小程序,并且 GET DATA(使用 INS-truction CA
)不太可能出现在根文件夹/小程序中。
TL;DR 您的连接正常,现在通过向其发出 GlobalPlatform 卡管理器命令来开始对其进行编程。如果可能,请使用不同的工具或获取 opensc 工具来跳过识别阶段/初始命令。
关于cryptography - OpenSC 无法将 javacard 与 PKCS 小程序连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52131519/