如何区分智能卡读卡器错误和智能卡错误

Posted

技术标签:

【中文标题】如何区分智能卡读卡器错误和智能卡错误【英文标题】:How to differentiate between smart card reader error and smart card error 【发布时间】:2017-06-15 09:45:04 【问题描述】:

我已经实现了一个 Andoid 应用程序 - 服务器端应用程序。服务器与智能卡读卡器通信。当用户触摸按钮时 在 android 应用程序中,正在构建与服务器的连接以获取用户身份验证。应用程序之间交换的消息 和服务器的格式如下:

<type> 0x00 0x00 0x00 <length> 0x00 0x00 0x00 <[data]>
如果消息的类型值06 表示智能卡读卡器出现错误。 如果消息的类型值07 表示智能卡中存在错误。

我正在使用如下代码与智能卡读卡器进行通信:

// show the list of available terminals
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
// get the first terminal
CardTerminal terminal = terminals.get(0);
// establish a connection with the card
Card card = terminal.connect("T=0");
System.out.println("card: " + card);
CardChannel channel = card.getBasicChannel();
ResponseAPDU r = channel.transmit(new CommandAPDU(c1));
System.out.println("response: " + toString(r.getBytes()));
// disconnect
card.disconnect(false);

智能卡 IO API 具有用于异常的 CardException 类。我的问题是我不知道何时发送0607 类型的消息,因为我无法区分卡生成的错误和CardException 引发时读取器生成的错误.我该如何处理?

【问题讨论】:

【参考方案1】:

transmit() 方法,用于

ResponseAPDU r = channel.transmit(new CommandAPDU(c1));

只会在与智能卡读卡器错误和读卡器与智能卡之间的通信问题相关的情况下引发异常。当卡本身指示错误时,它不会抛出异常。

因此您可以通过捕获异常来捕获所有与阅读器相关的错误:

try 
    ResponseAPDU r = channel.transmit(new CommandAPDU(c1));
 catch (IllegalStateException e) 
    // channel has been closed or if the corresponding card has been disconnected
 catch (CardException e) 
    // errors occured during communication with the smartcard stack or the card itself (e.g. no card present)

卡产生的错误,相反,被指示为在响应状态字中编码的错误代码。这些错误不会生成 Java 异常。您可以通过检查状态字(ResponseAPDU 的方法 getSW())来测试这些错误:

if (r.getSW() == 0x09000) 
    // success indicated by the card
 else 
    // error or warning condition generated by the card

【讨论】:

以上是关于如何区分智能卡读卡器错误和智能卡错误的主要内容,如果未能解决你的问题,请参考以下文章

连接金雅拓智能卡时出现错误 6

如何通过 Web 使用智能卡和智能卡读卡器实现双因素身份验证

如何通过 WMI 获取系统上的所有智能卡读卡器?

如何在没有卡的情况下向智能卡读卡器(而不是智能卡)发送命令?

发送 PPS 智能卡读卡器

与 IC 读卡器和 SLE5528 智能卡配合使用