设备和环境
安全元件(目前)使用:Yubiky 5 NFC
操作系统(目前)使用:Linux(未来目标将是Win和Android)
使用的读卡器:ACS ACR122U、REINER SCT cyberJack RFID、SCM SCL011
目标
通过NFC连接到Yubiky并执行/运行以下方法:
- 创建密钥对
- 导出公钥
- 标志
- 加密
- 解密
当前状态
基于Yubico的PKCS#11包装库,我实现了上面的5个方法。通过USB连接Yubiky,它们工作得很好。
问题
1)文档/支持
我在Yubico的网站上找不到任何关于NFC API的相关文档。似乎没有邮件列表,但有一个提示:
提出技术问题:有关技术问题,请尝试Stack Exchange站点。Stack Exchange是一个问答网站网络,供开发人员学习和分享他们的知识,其中包括Stack Overflow。
我在这里。;-)
根据Alexander的更新(谢谢):Yubico在github.com/Yubico 上发布了一些消息来源
2)CLI工具上的错误
以上提到的每一位读者都会看到pcsc_scan
的Yubiky。
但是,使用诸如gp
、opensc-tool
、pkcs11-tool
和pkcs15-tool
之类的通用工具时,当尝试使用例如通用APDU访问时,大多会出现错误0x6A80
。我看不到任何卡片,甚至无法选择一张。
(使用其他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可以通过NFC访问Yubiky来实现上述5种方法
- 使用这些API需要做些什么(例如安装额外的库)
更新
2022-08-16
得到一个提示:在yubico-pivtool/bob/master/lib/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
CCD_ 12可用于通过USB和NFC进行访问。";阅读器";选项-r
用于此。默认为Yubikey
,甚至可以缩写为Y
。
相同的";"轻";NFC读卡器的读卡器名称匹配:只需大致匹配即可。在我的案例中,它为我的三位读者使用了这些字符串:ACR122U、cyberJack和(古代)SCL011。通过指定读卡器名称,我可以很容易地通过NFC获得状态。
我再次请求Yubico支持文档。但至少我现在看到了一种通过分析yubico-piv-tool
源代码进行研究的方法。也许它甚至可以通过NFC使用PKCS#11。
2022-09-25
成功!
tl;dr:使用2.3.0版本的最新yubico-piv工具包,重新编译所有内容,使我们的PKCS#11软件通过NFC运行,实际上我们的代码没有任何更改。
将做更多的测试,并最终用所有的gotcha短语出匹配的答案。
将在此处更新此信息。
2022-10-04
对于前者";成功;消息我们有一个问题,只有一个阅读器工作(在使用pcscd时一定不会发生这种情况)。这是由我们的PKCS#11代码中的插槽处理中的一个小错误引起的(当通过USB使用Yubiky时,我们总是只有一个插槽和一个令牌——使用NFC时,我们有三个读卡器/插槽)。
仍在测试中。当一切都完成后,我会发布一个答案。
有几个问题。主要问题是我们处理多个读卡器/插槽的源代码中的一个错误,以及yubico-piv-tool
/libykcs11.so
的旧版本(2.2.1)。2022-03-01的当前版本2.3.0运行良好。
正如Yubico的支持所说,通过PKCS#11访问Yubiky可以通过USB和NFC透明地工作,没有任何变化
在CCD_ 19和我的所有NFC读取器同时连接的情况下;Yubiky 5 NFC";通过:
- USB
- NFC通过ACS ACR122U
- NFC通过REINER SCT cyberJack RFID
- NFC通过SCM SCL011
除了修复处理多个插槽的错误外,我们的PKCS#11源代码中没有通过NFC访问Yubiky所需的任何更改。
最终回答我的问题:
- ">在哪里可以找到相关文档"=>在Yubico网站和Yubico Github项目上
- ">哪些API可以通过NFC访问Yubiky来实现上述5种方法"=>只需使用PKCS#11 API和
yubico-piv-tool
中的libykcs11.so
>=2.3.0 - ">使用这些API需要做些什么(例如安装额外的库)"=>不需要额外的API。只需使用PKCS#11