【问题标题】:SmartCard reader "Access denied" while claiming interface with Webusb on chrome智能卡读卡器“拒绝访问”,同时在 Chrome 上声明与 Webusb 的接口
【发布时间】:2017-09-12 14:51:55
【问题描述】:

我正在开发一个 javascript 库,通过 chrome webusb API 使用 CCID 协议执行智能卡操作。当我在 Linux 和 MacOS 上插入智能卡读卡器时,一切都很顺利,但是当我尝试声明接口时,我卡在了 Windows 上。 我试图以管理员身份运行 chrome,禁用智能卡服务 / Windows 上的 CCID 驱动程序,以防那些声称接口的人,但什么也没做。我一直有 “未能声明接口:访问被拒绝(权限不足)” 信息。真的是权限问题吗?还是我不知道阻止访问的某些 Windows 服务?

编辑: 我在另一台 Mac 上尝试过,但阅读器无法正常工作。从 CCID 驱动程序 info.plist 中删除特定的供应商 ID/产品 ID 后,我设法使其工作。所以我想同样的问题也发生在 Windows 上,CCID 驱动程序正在“阻塞”访问接口。我有哪些选择?

设备描述符:

Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x1a44 VASCO Data Security International
  idProduct          0x0001 Digipass 905 SmartCard Reader
  bcdDevice            1.02
  iManufacturer           1 VASCO
  iProduct                2 DP905v1.1
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           93
    bNumInterfaces          1
    bConfigurationValue     1
iConfiguration          0 
    bmAttributes         0x80
  (Bus Powered)
MaxPower               50mA
Interface Descriptor:
  bLength                 9
  bDescriptorType         4
  bInterfaceNumber        0
  bAlternateSetting       0
  bNumEndpoints           3
  bInterfaceClass        11 Chip/SmartCard
  bInterfaceSubClass      0 
  bInterfaceProtocol      0 
  iInterface              0 
  ChipCard Interface Descriptor:
    bLength                54
    bDescriptorType        33
    bcdCCID              1.00
    nMaxSlotIndex           0
    bVoltageSupport         3  5.0V 3.0V 
    dwProtocols             3  T=0 T=1
    dwDefaultClock       3700
    dwMaxiumumClock      3700
    bNumClockSupported      1
    dwDataRate           9946 bps
    dwMaxDataRate      318280 bps
    bNumDataRatesSupp.     53
    dwMaxIFSD             254
    dwSyncProtocols  00000007  2-wire 3-wire I2C
    dwMechanical     00000000 
    dwFeatures       000404BE
      Auto configuration based on ATR
      Auto activation on insert
      Auto voltage selection
      Auto clock change
      Auto baud rate change
      Auto PPS made by CCID
      Auto IFSD exchange
      Short and extended APDU level exchange
    dwMaxCCIDMsgLen       272
    bClassGetResponse    echo
    bClassEnvelope       echo
    wlcdLayout           none
    bPINSupport             0 
    bMaxCCIDBusySlots       1
  Endpoint Descriptor:
    bLength                 7
    bDescriptorType         5
    bEndpointAddress     0x81  EP 1 IN
    bmAttributes            3
      Transfer Type            Interrupt
      Synch Type               None
      Usage Type               Data
    wMaxPacketSize     0x0004  1x 4 bytes
    bInterval              32
  Endpoint Descriptor:
    bLength                 7
    bDescriptorType         5
    bEndpointAddress     0x02  EP 2 OUT
    bmAttributes            2
      Transfer Type            Bulk
      Synch Type               None
      Usage Type               Data
    wMaxPacketSize     0x0010  1x 16 bytes
    bInterval               0
  Endpoint Descriptor:
    bLength                 7
    bDescriptorType         5
    bEndpointAddress     0x83  EP 3 IN
    bmAttributes            2
      Transfer Type            Bulk
      Synch Type               None
      Usage Type               Data
    wMaxPacketSize     0x0010  1x 16 bytes
    bInterval               0

【问题讨论】:

    标签: google-chrome smartcard-reader webusb


    【解决方案1】:

    您编辑的见解是正确的,如果 CCID 驱动程序阻止访问设备,则 Chrome 无法访问它。此外,在 Windows 上,操作系统必须知道要针对设备加载 WinUSB.sys 驱动程序(Windows 附带),否则任何用户空间应用程序(例如 Chrome)都无法访问它。这可以使用诸如this one 之类的INF 文件或通过将Microsoft OS descriptors 添加到设备以将“兼容ID”设置为“WINUSB”来实现。

    如果您要构建自己的设备,则后一种选择更可取,因为它将为您的用户提供即插即用支持,而前一种仍然需要 Windows 用户的手动安装步骤。

    如果您使用现有设备但可以控制 Windows 系统,则类似于编辑 macOS 驱动程序的 Info.plist,您可以进入 Windows 设备管理器并使用 WinUSB.sys 替换现有驱动程序像上面这样的 INF 文件。

    【讨论】:

    • 谢谢,您的解决方案适用于 windows !不幸的是,这是不可行的。我希望 webusb 可以解决网络和智能卡之间的差距。你认为有朝一日可以在 chrome 中实现对 CCID 类驱动程序的访问吗?
    • 我没有意识到将通用 CCID API 引入网络的工作。
    【解决方案2】:

    我对此很陌生,但据我所知,当本机驱动程序占用您的 USB 设备时,您会丢失并且浏览器对此无能为力。似乎解决方法可能是更改供应商或产品 ID(如果您可以这样做),因此本机驱动程序不会要求您的设备。如果这不是一个解决方案,Chrome 应用程序有更多的可能性,也许能够克服这个问题。

    【讨论】:

    • chrome.usb 和 WebUSB API 受到操作系统施加的相同限制。
    猜你喜欢
    • 2021-05-30
    • 1970-01-01
    • 2014-03-27
    • 2017-06-10
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多