1

尝试使用来自 VMWare Player 虚拟机(Windows 8.1 AMD64)的智能卡读卡器。该卡是美国政府发行的 PIV 卡,如相应的 NIST 标准中所述。主机是 Windows 7 AMD64。

我正在使用 WinSCard API。VERIFY 和 GET DATA 命令按预期工作。但是,当我执行 GENERAL AUTHENTICATE 以生成数字签名时,SCardTransmit() 返回错误代码 1,并且在调试输出中有消息:

First-chance exception at 0x77675B68 (KernelBase.dll) in PIVTool.exe:  0x00000001: Incorrect function.
First-chance exception at 0x77675B68 (KernelBase.dll) in PIVTool.exe: 0x0000071A: The remote procedure call was canceled, or if a call time-out was specified, the call timed out.
First-chance exception at 0x77675B68 in PIVTool.exe: Microsoft C++ exception: unsigned long at memory location 0x0113E48C.

在系统日志中,也有一些消息:

智能卡服务,ID 610:智能卡读卡器“VMware Virtual USB CCID 0”被拒绝 IOCTL 传输:功能不正确。如果此错误仍然存​​在,您的智能卡或读卡器可能无法正常工作。

命令头:00 87 07 9c

命令头与我传输的内容相匹配。

WudfUsbccidDrv ID 11:请求返回失败。MsgType:0x80 ICCStatus:0x0 CmdStatus:0x1 错误:0x0 SW1:0x0 SW2:0x0

接着

WudfUsbccidDrv ID 1:操作失败(0x0、0x0、0x0、0x0)。ScT1Transmit:发送请求失败。HResult:指定的请求对目标设备不是有效的操作。

并且

WudfUsbccidDrv ID 10: 请求 [0] (CLS=0x0,INS=0x87,P1=0x7,P2=0x9C,Lc=266,Le=0,.NETServiceMethod=0x0)

再次,这正是我的要求。

完全相同的代码在主机上按预期工作。相同的卡,相同的物理读卡器,相同的命令。卡驱动程序可能不同。

我已经针对 SunPCSC 安全提供程序尝试了一段等效的 Java 代码,只是为了检查细微的协议故障;它在 VM 上失败并显示类似消息:

javax.smartcardio.CardException:sun.security.smartcardio.PCSCException:未知错误 0x1

看起来 VMWare 的智能卡虚拟化层不喜欢这个特定的命令。请问有什么想法吗?

4

0 回答 0