我有一个计算机辅助设计中心智能卡,以及SCM Microsystems SCR3310 USB 读卡器。我正在运行带有 SP1 的 Windows 7 Ultimate。
此设置以前运行良好。当我插入 CAC 时,我的证书会立即传播到证书存储区(证书管理器可证明这一点certmgr.msc
),然后我就可以登录需要 CAC 才能访问的网站。
最近,我无法访问网站。查看证书管理器,我发现我的证书只有一个,有时有两个。如果我删除它们并重新插入我的卡,可能会出现不同的证书。
我刚刚退货并用相同型号的读卡器替换了它,所以我知道它不是罪魁祸首。
我最终想到查看系统日志,并发现插入智能卡时出现以下错误:
错误按时间顺序排列:
Smart Card Service Event ID: 610
Smart Card Reader 'SCM Microsystems SCR33xx v2.0 USB SC Reader 0' rejected
IOCTL TRANSMIT: Incorrect function. If this error persists, your smart card
or reader may not be functioning correctly.
Command Header: 00 c0 00 00
WudfUsbccidDrv Event ID: 11
A Request has returned failure.
MsgType: 0x80
ICCStatus: 0x0
CmdStatus: 0x1
Error: 0xf6 // ICC_PROTOCOL_NOT_SUPPORTED
SW1: 0x0
SW2: 0x0
WudfUsbccidDrv Event ID: 11
An operation has failed (0x0, 0x0, 0x0, 0x0).
ScT0Transmit: Failed to send request at TPDU level.
HResult: The specified request is not a valid operation for the target device.
// Note: this one comes from WUDFUsbccidDriver.dll CMyDevice::UsbScT0Transmit+7D0h
WudfUsbccidDrv Event ID: 10
Request[0](CLS=0x0,INS=0xc0,P1=0x0,P2=0x0,Lc=0,Le=256,.NETServiceMethod=0x0)
看来硬件在期间指示了故障IOCTL TRANSMIT
,并且该故障通过用户模式驱动程序框架逐渐显现出来。
编辑:查阅 CCID 规范,看来卡正在响应
bmCommandStatus = 1 - Failed (error code provided by the error register)
。并且Error = ICC_PROTOCOL_NOT_SUPPORTED -10 (F6h)
。我假设驱动程序将此错误转换为“HResult:指定的请求不是目标设备的有效操作。”消息。
此外,发送的命令是 INS=0xC0,即获取回应。
它怎么会说不支持协议?驱动程序与正常工作时有什么不同?请注意,我也刚刚用新的 CAC 尝试过这个,我看到了类似的行为。读卡器或驱动程序有问题吗?
考虑到我刚刚更换了读卡器(并重新安装了驱动程序、重新启动等),我的智能卡有问题吗?我假设没有,因为它做与其他系统上的其他阅读器配合使用。我还没有尝试过在同一系统上使用其他阅读器。
事实上,相同的连接到同一物理机上的 Windows 7 VM 的阅读器工作正常!显然有些地方出了问题,我正忙着找出问题所在。
那么问题是什么?
答案1
为了防止有人遇到这个问题 - 我已经尝试了一整天来解决这个问题。
解决方案如下:
对于 64 位 Windows - 跳转到注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Cryptography\Calais\Readers
应该已经有一些阅读器了。如果没有,那么这就是为什么你可能已经安装了所有驱动程序,但仍然无法正常工作的原因。
转到
Device Manager
,找到有问题的阅读器,然后在“详细信息”选项卡中查找此字符串:Bus reported device description
。为上面的键创建一个子键。名称应该与该键完全相同
Bus reported device description
。然后在末尾添加一个计数器。因此,该键应该是这样的:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Cryptography\Calais\Readers\O2Micro CCID SC Reader 0
现在创建几个字符串值:第一个是设备名称,第二个是组。这是我的示例:
Device = O2Micro CCID SC Reader 0 Groups = SCard$DefaultReaders
就是这样。要使其工作,请断开阅读器并重新连接。如果是内部设备,您可能必须重新启动机器。以下是.reg
文件示例(将设备名称和编号更改为您自己的值):
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Cryptography\Calais\Readers\O2Micro CCID SC Reader 0]
"Device"="O2Micro CCID SC Reader 0"
"Groups"=hex(7):53,00,43,00,61,00,72,00,64,00,24,00,44,00,65,00,66,00,61,00,75,\
00,6c,00,74,00,52,00,65,00,61,00,64,00,65,00,72,00,73,00,00,00,00,00