JavaSmartCardIO-如何处理 PC/SC 连接超时异常?

Posted

技术标签:

【中文标题】JavaSmartCardIO-如何处理 PC/SC 连接超时异常?【英文标题】:JavaSmartCardIO- How to handle timeout exception of PC/SC connection? 【发布时间】:2015-12-25 04:01:22 【问题描述】:

读卡器连接卡发送命令时,如果发送命令和接收响应的时间到了,系统是否会自动通知超时异常? 如果是,PC/SC 的超时值是多少? 或者我必须定义那个值?

【问题讨论】:

您的意思是响应 APDU 超时吗?如果是这样,它应该被自动处理(WTX 用于T=1 和 CLA 补充用于T=0)。我已经看到至少有一位读者在使用持久命令时遇到了问题(例如那些涉及密钥生成的命令)——我敢打赌WTX 只是被忽略了(然后供应商修复了他们的固件并且错误消失了)。另一个有趣的事情可能是 javacard 的 APDU.waitExtension() 方法(但我从未使用过它,也从未见过有人这样做)并弃用了 PC/SC 的 SCardSetTimeout...祝你好运! 【参考方案1】:

嗯,当读卡器中没有可用的卡时,有两种方法可用于处理异常:

布尔 sun.security.smartcardio.TerminalImpl.waitForCardAbsent ( long timeout ) 抛出 CardException [虚拟]

等到此终端中没有卡或超时到期。 如果该方法由于超时超时而返回,则返回 false。 否则返回 true。

如果调用此方法时此终端中没有卡,则 立即返回。

参数: timeout 如果为正,则阻塞最多超时毫秒;如果为零,则无限期阻塞;不能是负数

返回:如果方法由于超时而返回,则返回 false,否则返回 true。

异常: IllegalArgumentException 如果超时为负,CardException 如果操作失败

实现javax.smartcardio.CardTerminal。

文件TerminalImpl.java第136行的定义。

布尔 sun.security.smartcardio.TerminalImpl.waitForCardPresent(长时间超时)抛出 CardException [虚拟]

等到此终端中存在卡或超时到期。 如果该方法由于超时超时而返回,则返回 false。 否则返回 true。

如果调用此方法时此终端中存在卡片,则 立即返回。

参数:如果为正则超时,阻塞最多超时毫秒;如果为零,则无限期阻塞;不能是负数

返回:如果方法由于超时而返回,则返回 false,否则返回 true。

异常: IllegalArgumentException 如果超时为负,CardException 如果操作失败 javax.smartcardio.CardTerminal.

文件TerminalImpl.java第132行的定义。


关于卡的响应超时,您应该首先查看您的读卡器手册。一些智能卡读卡器除了向卡发送 APDU 命令外,还有一些附加功能。此命令称为“伪 APDU”。例如,我有一个 ACR38 接触式智能卡读卡器,我在其手册中找到了以下内容:

(来自here 第14页)


最后,如果您在阅读手册中没有发现任何有用的信息,我认为您有两个选择:

在始终执行的多线程 java 程序中实现timeout 方法,计算发送每个命令后的时间,并检查响应时间是否大于特定值。如果时间大于你的具体值,它会调用disconnect方法并重新连接它,然后你可以这样处理它。 使用 PCSC/CCID 库函数来控制此超时。

查看以下链接,我认为您可以在那里找到一些有用的东西来实现您的目标:

http://www.openscdp.org/ocf/api/de/cardcontact/opencard/terminal/smartcardio/PCSCIOControl.html

http://ludovic.rousseau.free.fr/softwares/pcsc-perl/PCSC.html

https://github.com/credentials/smartcardjs/blob/master/ext/scuba/acr122provider/src/net/sourceforge/scuba/smartcards/ACR122TerminalFactorySpi.java

http://myacr38.blogspot.com/2007/05/program.html

【讨论】:

注意:AFAIK PC_to_RDR_XfrBlock 命令在 CCID 协议级别,因此由读卡器驱动程序填充 bBWI 字段值。

以上是关于JavaSmartCardIO-如何处理 PC/SC 连接超时异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 MaxUploadSizeExceededException

如何处理 UsernameNotFoundException 春季安全

如何处理c#中的错误代码

Akka 如何处理消息版本?

开玩笑测试 - 如何处理 JsonWebToken 响应

如何处理 JSON 响应