0

我尝试在带有 libnfc 的 Mac OSX Mojave 10.14.6 上使用 ACR122 USB NFC 阅读器,当我尝试使用以下命令时出现“无法写入 USB(结果太大)”错误LIBNFC_LOG_LEVEL=3 nfc-list

info    libnfc.config   Unable to open file: /usr/local/etc/nfc/libnfc.conf
debug   libnfc.config   key: [device.allow_autoscan], value: [false]
info    libnfc.config   Unknown key in config line: device.allow_autoscan = false
debug   libnfc.config   key: [device.allow_intrusive_scan], value: [false]
info    libnfc.config   Unknown key in config line: device.allow_intrusive_scan = false
debug   libnfc.config   key: [device.log_level], value: [3]
info    libnfc.config   Unknown key in config line: device.log_level = 3
debug   libnfc.general  log_level is set to 3
debug   libnfc.general  allow_autoscan is set to true
debug   libnfc.general  allow_intrusive_scan is set to false
debug   libnfc.general  0 device(s) defined by user
nfc-list uses libnfc 1.7.1
debug   libnfc.driver.acr122_usb    device found: Bus 020 Device 020 Name ACS ACR122
debug   libnfc.general  1 device(s) found using acr122_usb driver
debug   libnfc.driver.acr122_usb    3 element(s) have been decoded from "acr122_usb:020:020"
debug   libnfc.driver.acr122_usb    TX: 62 00 00 00 00 00 00 01 00 00
error   libnfc.driver.acr122_usb    Unable to write to USB (Result too large)
debug   libnfc.general  Unable to open "acr122_usb:020:020".
nfc-list: ERROR: Unable to open NFC device: acr122_usb:020:020

当我开始进行故障排除时,我遇到了“无法声明 USB 接口”错误,其他人也遇到了这个错误。所以我从这个stackoverflow问题和我发现的这个github问题中尝试了以下事情:

  1. 使用 --> 安装 libnfc 出现brew install libnfc“无法声明...”错误。
  2. 使用 sudo -> 没有变化
  3. 禁用 PC/SC 守护进程 -> 没有做任何事情
  4. 编辑/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist->没有帮助
  5. 卸载libnfc,自己编译项目并禁用ifreader。我尝试使用驱动程序 acr122_usb 和 acr122_pcsc 构建它 -> 现在出现“无法写入 USB(结果太大)”错误。
    • 编译:autoreconf -iv && ./configure --with-drivers=acr122_usb && make clean && make && make install
    • sudo launchctl remove com.apple.ifdreader
    • sudo launchctl stop com.apple.ifdreader

现在进行故障排除后,我遇到了错误,不知道如何解决问题。阅读器指示灯不再闪烁红色,但由于错误,设备已明确连接到计算机并且可用。

作为一个侧面节点:我通过 USB 集线器连接阅读器,因为阅读器没有 USB C 电缆,但这应该不是问题。有没有人有同样的问题或我可以尝试其他方法?

4

3 回答 3

2

您的第 4 步,编辑/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist对我有用,这是我能找到的唯一干净的解决方案。

这里简要说明您需要做什么:

  • 禁用“系统完整性保护”
  • 从 plist 的 3 个数组 ifdFriendlyName、ifdVendorID 和 ifdProductID 中删除 3 个匹配行(具有相同的数组索引! )/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist
  • 启用“系统完整性保护”

在我的例子中,三行是条目号 370:

  • ifdFriendlyName="ACS ACR122U PICC 接口"
  • ifdVendorID=0x072F
  • ifdProductID=0x2200

详细的分步说明:

  1. 拔下 NFC 读卡器
  2. 关闭 OSX
  3. 启动 Mac 时按住键盘<cmd>+<R>上的键进入恢复模式
  4. 在恢复模式下使用“实用程序”菜单打开终端窗口
  5. 执行命令csrutil disable
  6. 正常重启你的 Mac
  7. 打开终端窗口并执行以下命令:

    sudo -i
    cd /usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents
    cp Info.plist Info.plist.orig
    patch -l -p0 <<EOF
    --- Info.plist.orig 2019-12-07 20:26:36.000000000 +0100
    +++ Info.plist  2019-12-07 20:26:40.000000000 +0100
    @@ -471,7 +471,6 @@
            <string>0x1050</string>
            <string>0x1050</string>
            <string>0x1050</string>
    -       <string>0x072F</string>
            <string>0x09C3</string>
            <string>0x03EB</string>
            <string>0x0A5C</string>
    @@ -864,7 +863,6 @@
            <string>0x0405</string>
            <string>0x0406</string>
            <string>0x0407</string>
    -       <string>0x2200</string>
            <string>0x0008</string>
            <string>0x6016</string>
            <string>0x5800</string>
    @@ -1257,7 +1255,6 @@
            <string>Yubico Yubikey 4 OTP+CCID</string>
            <string>Yubico Yubikey 4 U2F+CCID</string>
            <string>Yubico Yubikey 4 OTP+U2F+CCID</string>
    -       <string>ACS ACR122U PICC Interface</string>
            <string>ActivCard ActivCard USB Reader V2</string>
            <string>ATMEL VaultIC460</string>
            <string>Broadcom Corp 5880</string>
    EOF
    
  8. 正常重启你的 Mac

  9. 插入您的 NFC 读卡器
  10. 测试 nfc 实用程序现在是否正在工作,例如通过调用nfc-scan-device
  11. 关闭 OSX
  12. 按住键盘<cmd>+<R>上的键,然后启动 Mac 以进入恢复模式
  13. 使用“实用程序”菜单打开终端窗口
  14. 执行命令csrutil enable
  15. 正常重启你的 Mac

@anderssonjohan在他的帖子中给出了正确答案,但他发布的 plist 文件不一致,因为他只删除了一行而不是三行。

于 2019-12-07T20:54:39.627 回答
1

第一个解决方案是我需要的,但启用 SIP、更改驱动程序和恢复 SIP 对我来说太过分了,只是为了为我们的读者禁用 PC/SC。

如果您在某些与 PC/SC 兼容的 macos 应用程序中使用阅读器,此解决方案将不适合您。

我找到了没有启用/禁用 SIP 的解决方案。

  1. 安装非系统驱动程序,在我的情况下是https://www.acs.com.hk/download-driver-unified/12835/ACS-Unified-INST-MacOSX-1182-P.zip这是 acsccid 驱动程序。
  2. 在本地系统中找到这样的文件夹 /usr/local/libexec/SmartCardServices/drivers/ifd-acsccid.bundle/Contents 不受 SIP 保护,因为它是 /usr/local 并且是用户驱动程序
  3. 修改文件 Info.plist 如何在第一个答案中描述
  4. 拔下并插入读卡器 - led 不工作(这是预期的!)
  5. 确保 lsusb 在列表中显示您的读者
  6. libnfc 与 acr122_usb 驱动程序一起使用

在这种情况下,macos 系统会忽略系统驱动程序,因为已安装用户驱动程序和从它们应用的所有配置,即使设备已被忽略。

使用来自 master 和 macos BigSur 11.6 的最新版本的 libnfc 进行测试并运行良好

注意:为了能够正确使用 gen3 fob,我建议从 master 编译和安装 libnfc,已经进行了一些新更改但尚未发布(

于 2021-10-13T15:30:53.303 回答
0

最初的问题是,守护进程system/com.apple.ifdreader加载基于 pcsc-lite/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle的用户级驱动程序并声明 USB 设备的所有权。要使 libnfc 可以访问读卡器,您可以

  • 告诉 ifd-ccid 忽略 USB 设备(我会告诉你如何实现)
  • 告诉 libnfc 使用 pcsc-lite
  • 完全禁用 ifdreader 守护进程(我认为这有风险,尤其是在系统升级时)

我对这个问题做了两个回答:

  1. 这个假设您对终端和恢复环境中的路径更加熟悉。除了禁用“系统完整性保护”并需要像我的其他答案中描述的那样多次重启之外,您也可以只重启一次
  2. 另一个答案需要更多步骤(尤其是重新启动),我之前已经写过了。它会暂时禁用“系统完整性保护”,当您忘记再次启用它时会有风险。

您可以在此处执行一些命令来显示服务的状态:

launchctl list com.apple.ifdreader
launchctl blame system/com.apple.ifdreader

只是杀死守护程序或禁用它是行不通的,当系统检测到其 ID 列在其 Info.plist 中的 USB 设备时,它会自动(重新)启动,因此您需要从/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist.

不幸的是,该文件受 MacOS Mojave 10.14.6 中的“系统完整性保护”保护,因此您只能在启动到恢复模式并在那里修改它或禁用“系统完整性保护”时csrutil disable才能修改它,以便能够在正常的用户环境。

这些是您需要执行的步骤:

  1. 准备新的 Info.plist 并保留原件的备份(见下文)
  2. 关闭 OSX
  3. 按住键盘<cmd>+<R>上的键,然后启动 Mac 以进入恢复模式
  4. 使用“实用程序”菜单打开“终端”窗口
  5. /usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist用您准备的替换原件

在进入recovery模式之前你需要知道在哪些路径下可以找到文件,因为root-filesystem不同,你正常的root文件系统会挂载在/Volumes/< TheNameOfYourSystemDisk >下,所以之前在Finder中查找这个名称进入恢复模式。

例如我的系统驱动器被调用Macintosh HD,路径是:

  • 我的主页:/Volumes/Macintosh HD/Users/michael
  • pinfo 文件:/Volumes/Macintosh HD/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist

在我的示例中,最好的方法chroot '/Volumes/Macintosh HD'是能够使用大多数正常的 CLI 命令。

要创建新的 Info.plist 文件,您可以使用我其他答案中的小补丁。或者您可以使用更灵活的附加 python 脚本。只需调用脚本,它将SmartCardService_disable在当前目录的子目录中创建更改后的 Info.plist 文件:

#!/usr/bin/env python3
import os, re, plistlib
from shutil import copyfile
plistFile = "/usr/libexec/SmartCardServices/drivers/ifd-ccid.bundle/Contents/Info.plist"
plistFileBak = "Info.plist.orig"
plistFileOut = "Info.plist"
workDir = "SmartCardService_disable"
usbFriendlyNamePattern = ".*ACS.*ACR122.*"

def findDevicesByFriendlyName(pl, usbFriendlyNamePattern) :
        reUsbFriendlyName = re.compile(usbFriendlyNamePattern, re.IGNORECASE)
        indexes = []
        for index, item in enumerate(pl["ifdFriendlyName"]):
                if reUsbFriendlyName.fullmatch(item) :
                        indexes.append(index)
        return indexes

def makePlistCopy() :
        try:
                os.mkdir(workDir)
        except FileExistsError:
                pass
        except:
                raise Exception("Unable to create work directory")
        os.chdir(workDir)
        try:
                os.stat(plistFileBak)
        except FileNotFoundError:
                copyfile(plistFile, plistFileBak)
        except:
                raise Exception("Unable to copy plist file")

makePlistCopy()
pl = plistlib.readPlist(plistFileBak)
indexes = findDevicesByFriendlyName(pl, usbFriendlyNamePattern)
indexes.sort(reverse = True)
for index in indexes:
        del pl["ifdFriendlyName"][index]
        del pl["ifdVendorID"][index]
        del pl["ifdProductID"][index]

plistlib.writePlist(pl, plistFileOut)

该脚本可以很容易地适应删除其他读卡器,只需更改usbFriendlyNamePattern = ".*ACS.*ACR122.*"为任何其他模式。

于 2019-12-08T13:12:21.833 回答