【问题标题】:OpenSC fails to connect javacard with PKCS appletOpenSC 无法将 javacard 与 PKCS 小程序连接
【发布时间】:2018-09-01 19:23:26
【问题描述】:

我有空的JavaCOS A40 智能卡,想将其设为 PKCS PKI 卡。

我将使用它作为 ssh 密钥和电子合同签署。俄罗斯不像欧盟国家那样为公民提供基于智能卡的电子身份证。商业电子签名提供商正在销售某种受密码保护的 USB 驱动器,使用起来不安全,因为您可以轻松导出私钥。他们也出售普通的智能卡,但它们真的很贵(比空的 javacard x10-x20)而且寿命很短(大约 1 年)。所以我想根据 javacard 的 RSA 算法制作我自己的 PKI 卡。

现在我的 javacard 处于OP_READY 状态,我没有更改它,因为更改是不可逆的。它使用默认密钥,任何人都可以上传任何内容。我在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 连接成功,我可以向小程序发送低级命令

但是当我尝试使用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

根据制造商信息,卡支持T=0 over ISO7816,但opensc 尝试与T=1 通信。那么我该如何解决呢?

看来,opensc 工具是不可定制的。我需要使用pkcs15-crypt,但无法连接。我可以更改驱动程序、使用补丁重新编译 opensc 或使用其他实用程序吗?例如,我可以通过哪些其他方式来使用 OpenPGP?

【问题讨论】:

    标签: cryptography smartcard javacard openpgp


    【解决方案1】:

    您的问题肯定不在于传输协议,因为它与卡通信 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=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 工具来跳过识别阶段/初始命令。

    【讨论】:

    • 抱歉回答晚了,但是模组忘记包含正确的标签所以我没看到。
    • 我希望我有。我发布了这个,因为问题显然不在于传输协议。但是,该卡显然没有实现该工具所期望的协议 - 根中的 GET DATA 不必为 Java Card 实现,而且我不知道如何抑制该协议。如果我有时间我可能会在明天检查。作为最后的手段,您可以查看源代码并可能禁用匹配的 ATR。或者联系该工具的开发人员并要求他们这样做。
    【解决方案2】:

    IsoApplet 和 OpenPGP 是两个不同的世界。有关 OpenPGP 支持,请查看 github 上 ANSSI-FR 的 SmartPGP 或 ykneo-openpgp(也在 Github 上)。

    对于签名,您也不​​需要 pkcs15-crypt,但应该通过 PKCS#11 库来代替。

    出于这个特定原因 - 与 epass 匹配的卡,请在 opensc.conf 中禁用 epass 驱动程序。

    【讨论】:

    • 我是 javacard 新手。很高兴在这里见到你。谢谢你的全科医生,它是很棒的工具
    猜你喜欢
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多