通过NFC访问Yubiky API



设备和环境

安全元件(目前)使用: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。

但是,使用诸如gpopensc-toolpkcs11-toolpkcs15-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

问题

  1. 在哪里可以找到相关文档
  2. 哪些API可以通过NFC访问Yubiky来实现上述5种方法
  3. 使用这些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所需的任何更改。

最终回答我的问题:

  1. ">在哪里可以找到相关文档"=>在Yubico网站和Yubico Github项目上
  2. ">哪些API可以通过NFC访问Yubiky来实现上述5种方法"=>只需使用PKCS#11 API和yubico-piv-tool中的libykcs11.so>=2.3.0
  3. ">使用这些API需要做些什么(例如安装额外的库)"=>不需要额外的API。只需使用PKCS#11

最新更新