如何访问 Omnikey 3121 智能卡读卡器
Posted
技术标签:
【中文标题】如何访问 Omnikey 3121 智能卡读卡器【英文标题】:How to get access to Omnikey 3121 smart card reader 【发布时间】:2019-03-01 21:00:37 【问题描述】:我想使用 Java 来通过 Omnikey 读卡器访问智能卡。我找到了一些解决方案,比如 smartcardio,但它没有足够的帮助。基本上我与阅读器连接,但当我不需要它时它使用 APDU。我有一个想法,通过 USB 向我的阅读器打开流,并通过流将二进制命令发送到设备,然后以相同的方式获得答案,但从技术上讲,我该如何用 Java 编写它?
我还发现了类似 usb4java 的库,但对此也有不好的看法。也许有人对这个设备有任何经验,可以给我一些提示吗?
互联网上没有太多关于智能卡编程的教程。我也尝试使用 pyApduTool 或 HID Omnikey Sync API V2.0.,但这仅用于测试。我必须编写简单的请求以从卡中获取信息。
【问题讨论】:
我不完全理解您的问题“当我不需要它时使用 APDU”。与 card 的通信是通过 APDU 完成的,这是迄今为止最简单的方法。为简单起见,您必须与 阅读器 通信的更奇特的任务通常也映射到 APDU。先看看this question 及其答案。 这个问题有很多内容,但里面没有的是你想要做的事情。 @MaartenBodewes 你是什么意思? @guidot 我必须为此卡发送特定请求,所以我想打开流然后发送二进制请求。但是感谢您的链接。 【参考方案1】:基本上有两种方法可以解决您的问题:
不要使用java.smartcardio
使用的 PC/SC 接口,而是使用读卡器制造商提供的本地专有库,例如使用包装器(基于 JNI,但有更好/更高级别的替代方案那里);
继续使用 APDU,但使用设置为 FF
十六进制的 CLA 字节,打开与阅读器的连接。 FF
是保留的,但一般是为这种读卡器访问保留的,例如访问读卡器制造商支持的没有 ISO/IEC 7816-4 层的存储卡。
二选一(仅用于完整性):许多读卡器已经使用USB转串口芯片创建,这意味着您可以直接连接到(虚拟)串口;不用说,如果这个接口存在的话,你必须知道要发送什么命令并自己编程(Omnikey 3121 相对较新,所以我会感到惊讶)。
这两个选项都依赖于读卡器的特定功能,因此您将找到读卡器的信息以了解可能的情况。据我所知,没有办法要求提供什么功能。不要对此类功能的标准化抱有太多期望。
您是否检查了您的读卡器特定文档?
【讨论】:
谢谢,我会试试的。我还有一件事我不明白。我找到了获取响应的解决方案(基本上是从卡中获取“hello”,因为我知道每张卡的命令都是相同的),并且在使用命令之前的第一步是“选择小程序”。我不知道我的卡的 AID 是什么,所以我尝试通过“PyApduTool”知道这一点,连接后,我切换到“Applet”选项卡。刷新后得到信息“列表小程序失败。错误:GP 初始化更新失败。recv:6D 00”。也许你知道那是什么意思? (我知道什么是 6D 00 代码,而且我的卡肯定是用 Java 编程的) 6D00 是未知指令。您需要在卡片管理器中执行这些操作,您可以通过 AID 选择。它要么是 VISA 的(OpenPlatform 最初是由 VISA/Mastercard 调用的),要么是用于较新卡的 GP。但是,对于 INIT UPDATE / EXT AUTH,您需要知道安全域的密钥。这些通常不以发布的卡而闻名。例如。 POS终端知道银行APP的AID,不需要列出来。 不幸的是,我使用 usb4java 库得到“无法打开 USB 设备:此平台上不支持或未实现的操作”。 是的,太新了,不记得里面有一个 FTDI 芯片。可能是单芯片解决方案,集成它已经太昂贵了。 反正..我终于用APDU协议发送请求了。我收到响应,但数据以 ISO 7816 格式返回。我尝试解析对字符串的响应,但某些数据被解析为无法识别的字符......你能推荐一种用 Java 解码 apdu 响应的好方法吗?以上是关于如何访问 Omnikey 3121 智能卡读卡器的主要内容,如果未能解决你的问题,请参考以下文章
将 javax.smartcardio 用于 MIFARE Classic 和 Omnikey 5021 CL
对 Omnikey PinPad 3821 进行编程以在屏幕上显示自定义文本