YubiKey NFC模式API接入技术问题问询及实践进展
设备与环境
- 安全元件(Secure Element)(当前使用):Yubikey 5 NFC
- 操作系统(OS)(当前使用):Linux(未来目标平台为Windows和Android)
- 读卡器:ACS ACR122U、REINER SCT cyberJack RFID、SCM SCL011
目标
通过NFC连接YubiKey并实现以下操作:
- 创建密钥对(Create Key Pair)
- 导出公钥(Export Public Key)
- 签名(Sign)
- 加密(Encrypt)
- 解密(Decrypt)
当前状态
基于Yubico的PKCS#11包装库,我已实现上述5种操作。当YubiKey通过USB连接时,所有操作均可正常运行。
问题
1) 文档/支持缺失
我在Yubico官网未找到任何关于NFC模式API的相关文档。官网没有提供邮件列表,但给出了提示:
技术问题咨询:
如需咨询技术问题,请尝试Stack Exchange系列站点。Stack Exchange是开发者学习和分享知识的问答网络,包括Stack Overflow。
因此我在此提问。;-)
根据提示更新:Yubico在GitHub上发布了部分资源。
2) CLI工具报错
上述所有读卡器均能通过pcsc_scan识别到YubiKey。
但使用gp、opensc-tool、pkcs11-tool和pkcs15-tool等常用工具时,执行常见APDU操作大多会报错0x6A80,无法查看或选择任何卡应用(cardlet)。
(使用其他NFC设备执行相同命令时,部分命令返回0x9000/成功并返回数据,但在YubiKey上会触发0x6A80错误。)
gp工具的输出示例:
gp -lvdi [DEBUG] TerminalManager - Selected the only reader with a card SCardConnect("Yubico YubiKey OTP+FIDO+CCID 00 00", T=*) -> T=1, 3BFD1300008131FE158073C021C057597562694B657940 # GlobalPlatformPro 325fe84 # Running on Linux 5.18.5-100.fc35.x86_64 amd64, Java 11.0.14 by SAP SE A>> T=1 (4+0000) 00A40400 00 A<< (0000+2) (1ms) 6A80 Error: Could not SELECT default selected: 0x6A80 (Wrong data/incorrect values in data) pro.javacard.gp.GPException: Could not SELECT default selected: 0x6A80 (Wrong data/incorrect values in data) at pro.javacard.gp.GPException.check(GPException.java:64) at pro.javacard.gp.GPSession.discover(GPSession.java:145) at pro.javacard.gp.GPTool.run(GPTool.java:208) at pro.javacard.gp.GPTool.main(GPTool.java:107) SCardDisconnect("Yubico YubiKey OTP+FIDO+CCID 00 00", true) tx:5/rx:2
问题咨询
- 相关文档可在哪里获取?
- 可通过哪些API实现上述5种操作的YubiKey NFC模式访问?
- 使用这些API需要做哪些准备(如安装额外库)?
更新记录
2022-08-16
得到提示:在yubico-piv-tool的头文件ykpiv.h中定义了YKPIV_INS_SELECT_APPLICATION,值为A4,这是一个常见指令。
选择操作成功:
# opensc-tool -s 00:A4:04:00:05:A0:00:00:03:08:00 -v Using reader with a card: ACS ACR122U 00 00 Connecting to card in reader ACS ACR122U 00 00... Using card driver Personal Identity Verification Card. Sending: 00 A4 04 00 05 A0 00 00 03 08 00 Received (SW1=0x90, SW2=0x00): 61 11 4F 06 00 00 10 00 01 00 79 07 4F 05 A0 00 a.O.......y.O... 00 03 08 ...
2022-08-31
yubico-piv-tool可用于USB和NFC模式访问,通过“读卡器”选项-r指定。默认值为Yubikey,可缩写为Y。
NFC读卡器支持模糊匹配名称:只需名称大致匹配即可。我的三台读卡器使用以下字符串均可正常工作:ACR122U、cyberJack和(旧款)SCL011。指定读卡器名称后,我可轻松获取NFC模式下的设备状态。
我再次向Yubico支持咨询文档,但至少现在我找到了通过分析yubico-piv-tool源代码进行研究的途径,甚至可能实现通过NFC使用PKCS#11。
2022-09-25
成功!
简而言之:使用最新版本2.3.0的yubico-piv-tool包并重新编译所有内容后,我们的PKCS#11软件无需修改代码即可通过NFC模式运行。
我将进行更多测试,最终整理包含所有注意事项的完整解答,并在此更新。
2022-10-04
之前的“成功”存在一个问题:只有一台读卡器可以正常工作(使用pcscd时不应出现此情况)。
问题源于我们PKCS#11代码中的一个插槽处理小bug(YubiKey通过USB连接时始终只有一个插槽和一个令牌,但NFC模式下有三个读卡器/插槽)。
仍在测试中,完成后我将发布解答。
内容的提问来源于stack exchange,提问作者reichhart

