cryptography - OpenSC 无法将 javacard 与 PKCS 小程序连接

标签 cryptography smartcard javacard openpgp

我有空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

cardpeek 成功连接到它,我可以向小程序发送低级命令 cardpeek

但是当我尝试使用 opensc 探测器连接到卡和小程序以查看请求应答 (ATR) 时,它失败 opensc-tool --reader 0 --atrSee 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/

相关文章:

smartcard - Java 卡在共享方法的调用点返回 0x6F00

java - SLE4428 智能卡问题

python - 智能卡 PKCS11 AES key 生成失败

java - Javacard 中的共享接口(interface) : use cases and implementation

javascript - 使用 AES 的 CryptoJS 库时解密输出不正确

smartcard - JavaCard:小程序的实例如何调用另一个实例的上下文中的方法?

java - 如何在Java Card小程序中使用Shareable接口(interface)?

delphi - RSA 在 delphi(lockbox) 和 go1.5 之间加密/解密

javascript - 我应该如何使用客户端 JavaScript 加密大文件?

c# - 使用 AES 256 加密和解密查询字符串值