通过 NFC 访问 Yubikey API

rei*_*art 5 linux pkcs#11 hardware-security-module yubico yubikey

设备与环境

使用的安全元件(当前):Yubikey 5 NFC

(当前)使用的操作系统:Linux(未来目标将是Win和Android)

使用的读卡器:ACS ACR122U、REINER SCT cyberJack RFID、SCM SCL011

目标

通过 NFC 连接到 Yubikey 并实现/运行以下方法:

  • 创建密钥对
  • 导出公钥
  • 符号
  • 加密
  • 解密

当前状态

基于 Yubico 的 PKCS#11 包装器库,我实现了上面的 5 个方法。通过USB连接 Yubikey,它们工作得很好。

问题

1) 文档/支持

我在 Yubico 的网站上找不到任何有关通过 NFC 的 API 的相关文档。似乎没有邮件列表,但有一个提示:

询问技术问题:对于技术问题,请尝试 Stack Exchange 网站。Stack Exchange 是一个问答网站网络,供开发人员学习和分享他们的知识,其中包括 Stack Overflow。

我在这里。;-)

根据 Alexander 的更新(谢谢):一些来源由 Yubico 在github.com/Yubico上发布

2) CLI 工具错误

Yubikey 由pcsc_scan上述每个读者展示。

但使用常见工具(如gp、 )时opensc-tool,大多数情况pkcs11-tool下会在尝试使用常见 APDU 访问时显示pkcs15-tool问题。0x6A80我看不到任何卡片,甚至无法选择一张。

(使用其他 NFC 设备,我获得/success 和一些在 Yubikey 上0x9000引起的命令的数据。)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
Run Code Online (Sandbox Code Playgroud)

问题

  1. 哪里可以找到相关文档?
  2. 可以通过哪些API通过NFC访问Yubikey来实现上述5种方法?
  3. 使用这些 API 需要做什么(例如安装额外的库)?

更新

2022-08-16

得到一个提示:在yubico-piv-tool/blob/master/lib/ykpiv.hYKPIV_INS_SELECT_APPLICATION中,有一个看起来很常见的value定义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                                        ...
Run Code Online (Sandbox Code Playgroud)

选择文件命令

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

成功!

tl;dr:使用 2.3.0 版中最新的 yubico-piv-tool 包并重新编译所有内容,使我们的 PKCS#11 软件通过 NFC 运行,实际上我们的代码没有任何更改。

将做更多的测试,并最终给出一个包含所有问题的匹配答案。

将在这里保持更新。

2022-10-04

对于前一个“成功”消息,我们遇到了一个问题,即只有一个阅读器可以工作(使用 pcscd 时一定不会发生这种情况)。这是由我们的 PKCS#11 代码中的插槽处理中的一个小错误引起的(当通过 USB 使用 Yubikey 时,我们总是只有一个插槽和一个令牌 - 使用 NFC 时,我们有三个读卡器/插槽)。

仍在测试。当一切完成后,我将发布答案。

rei*_*art 1

有几个问题。主要问题是我们的源代码中处理多个读取器/插槽和旧版本 (2.2.1) 的yubico-piv-tool/的错误libykcs11.so。2022 年 3 月 1 日的当前版本 2.3.0 运行良好。

正如 Yubico 支持人员所说,通过 PKCS#11 访问 Yubikey 可以通过 USB 和 NFC 透明地进行,无需任何更改。

pcsc_scan我的所有 NFC 读卡器同时连接时,我可以通过以下方式访问“Yubikey 5 NFC”:

  • USB
  • 通过 ACS ACR122U 进行 NFC
  • 通过 REINER SCT cyberJack RFID 进行 NFC
  • 通过 SCM SCL011 进行 NFC

除了修复处理多个插槽的错误之外,通过 NFC 访问 Yubikey 所需的 PKCS#11 源代码没有任何更改。

最后回答我的问题:

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