从 Linux 64 位访问 javax.smartcardio

2022-09-01 20:03:34

我正在尝试使用以下代码使用javax.smartcardio API加载智能卡终端:

public CardTerminal getReadyCardTerminal() throws CardException {

    TerminalFactory factory = TerminalFactory.getDefault();
    CardTerminals terminals = factory.terminals();
    List<CardTerminal> list = terminals.list(State.CARD_PRESENT);

    while (list.isEmpty()) {
        terminals.waitForChange(1000);
        list = terminals.list(State.CARD_PRESENT);
    }
    CardTerminal cardTerminal = list.get(0);
    return cardTerminal;
}

...我总是得到以下例外:

java.lang.IllegalStateException: no terminals
at javax.smartcardio.TerminalFactory$NoneCardTerminals.waitForChange(TerminalFactory.java:145)

在Windows Vista/7上,一切都很好,但我无法让它在Linux上工作。我使用的是 Ubuntu 12.04 64 位。

我使用以下命令安装了 pcscd 服务:

sudo apt-get install libccid pcscd libpcsclite-dev libpcsclite1
sudo service pcscd start

pcsc_scan 命令打印以下内容:

PC/SC device scanner
V 1.4.18 (c) 2001-2011, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.7.4
Using reader plug'n play mechanism
Scanning present readers...
0: OMNIKEY CardMan 3x21 00 00

Tue Sep 11 15:44:49 2012
Reader 0: OMNIKEY CardMan 3x21 00 00
  Card state: Card inserted, 
  ATR: <some hexa codes>
  ...

所以一切看起来都还好,但聪明的心智是行不通的。我正在尝试使用Oracle和OpenJDK 1.7.0_05,32和64位。

该代码在Ubuntu 32位环境中与OpenJDK一起运行良好(但与Oracle JDK无关,不知道为什么)。所以我认为这是从Java到PC / SC库的64位桥接的问题。

有什么想法吗?

谢谢。


答案 1

我想我找到了解决这个问题的方法,因为我刚刚遇到了类似的问题。在ubuntu的一篇错误报告中,它说javax.smartcardio库在错误的目录中搜索PC / SC库。

通过指定计算机上PC / SC库的路径,就像bugreport提到的,我让它工作了。

bugreport中的路径对我来说是错误的,我在64位fedora上,其中pc / sc库安装在/usr/lib64 / libpcsclite.so.1

因此,我的解决方法是指定java的库路径,如下所示:

java -Dsun.security.smartcardio.library=/usr/lib64/libpcsclite.so.1

根据您的Linux发行版,实际位置可能会有所不同,也可能位于(即Kubuntu 15.04)。在这种情况下,可以这样称呼它:libpcsclite.so.1/lib/x86_64-linux-gnu/libpcsclite.so.1

java -Dsun.security.smartcardio.library=/lib/x86_64-linux-gnu/libpcsclite.so.1

答案 2

我正在使用覆盆子与 debian 手臂版本

首先通过以下方式找到 libpcsclite 的位置:

$ ldd -r /usr/bin/pcsc_scan

,然后将 libpcsclite 位置与:

java -Dsun.security.smartcardio.library=/usr/lib/arm-linux-gnueabihf/libpcsclite.so.1

推荐