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

Cryptography OpenSC无法将javacard与PKCS小程序连接,cryptography,smartcard,javacard,openpgp,Cryptography,Smartcard,Javacard,Openpgp,我有空的智能卡,想把它做成PKCS PKI卡 我将使用它作为ssh密钥和电子合同签署。俄罗斯不像欧盟国家那样为公民提供基于智能卡的电子身份证。商业电子签名提供商正在出售某种受密码保护的usb驱动器,这种驱动器使用起来不安全,因为您可以轻松导出私钥。他们也销售普通的智能卡,但它们确实很贵(比空的javacard贵10-x20)而且寿命短(大约1年)。所以我想用javacard基于RSA算法制作我自己的PKI卡 现在我的javacard处于状态OP_READY,我没有更改它,因为更改是不可逆的。它使

我有空的智能卡,想把它做成PKCS PKI卡

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

现在我的javacard处于状态
OP_READY
,我没有更改它,因为更改是不可逆的。它使用默认密钥,任何人都可以上传任何东西。我在
Ubuntu
上使用
ACR38U
读卡器和
pcsc
linux驱动程序,它工作正常,所以我习惯于默认上传PKI。因此,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
成功连接到它,我可以向applet发送低级命令

但当我尝试使用
opensc
prober连接卡和applet以查看请求应答(ATR)时,它失败了
opensc工具--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
根据制造商信息,该卡支持ISO7816上的
T=0
,但opensc尝试与
T=1
通信。那我怎么才能解决这个问题呢


似乎opensc工具是不可定制的。我需要使用
pkcs15 crypt
,但它无法连接。我可以更改驱动程序、用补丁重新编译opensc或使用其他实用程序吗?例如,我如何使用其他方法来处理OpenPGP?

您的问题肯定不在于传输协议,因为它将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命令从中获取任何数据。这并不奇怪,因为它没有首先选择任何小程序,并且获取的数据(使用说明
CA
)不可能出现在根文件夹/applet中


TL;DR您的连接正常,现在通过向其发出GlobalPlatform卡管理器命令来开始编程。如果可能,使用不同的工具或使用opensc工具跳过识别阶段/初始命令。

IsoApplet和OpenPGP是两个不同的世界。要获得OpenPGP支持,请查看github上由ANSSI-FR提供的SmartPGP或ykneo OpenPGP(也在github上)

对于签名,您也不需要pkcs15 crypt,而是应该通过PKCS#11库工作


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

很抱歉回答得太晚,但是mods忘记包含正确的标签,所以我没有看到它。我希望我看到了。我之所以发布此消息,是因为问题显然与传输协议无关。然而,该卡显然没有实现该工具所期望的协议——不必为Java卡实现根目录中的数据,而且我不知道如何抑制该协议。如果我有时间的话,我可能明天去看看。作为最后手段,您可以查看源代码并可能禁用匹配的ATR。或者联系该工具的开发人员,让他们来做。我对javacard不熟悉。很高兴在这里见到你。谢谢你的GP,这是一个很棒的工具