Java Web 应用程序可以访问远程工作站上的智能卡读卡器吗?

Posted

技术标签:

【中文标题】Java Web 应用程序可以访问远程工作站上的智能卡读卡器吗?【英文标题】:Can a Java Web Application access a Smart card reader on a remote work station? 【发布时间】:2014-11-15 18:31:02 【问题描述】:

我正在为我们现有的基于 Java 的 Web 应用程序之一开发一些新功能。 Web 应用程序本身托管在我们的一台内部服务器上,可以通过我们设施内多个计算机终端上的浏览器进行访问。该应用程序用于在我们生产过程的各个阶段进行质量检查。目前,用户需要手动登录,方法是从下拉列表中选择用户名并输入密码,然后再进行每次质量检查。为了加快进程,我被要求实现读取智能卡以进行登录。

我使用 javax.smartcardio 编写了一个实用程序类,我可以访问插入笔记本电脑的 USB 读卡器终端,从卡中读取 ATR,并在运行应用程序时使用该信息登录应用程序在我本地的 tomcat7 服务器上。所以,在我的本地机器上,一切正常。

不幸的是,一旦我将应用程序部署到我们的 Web 服务器,我就无法再检测到读卡器终端,因为我认为 Java Web 应用程序实际上是在它部署到的机器上寻找读卡器。

有什么方法可以让我的 java 代码通过与浏览器交互来访问插入远程工作站的读卡器?

Web 应用程序是用 GWT 编写的,我使用 RPC 调用来访问后端服务器端代码。任何帮助是极大的赞赏。读卡器代码很简单,如果有帮助,我会发布它:

import java.util.List;

import javax.smartcardio.Card;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;

public class SwipeCardUtil 


    private static org.apache.log4j.Logger LOGGER  = org.apache.log4j.Logger.getLogger("hwslqc");

    /**
     * @return ATR
     */
    public static String readCardATR()
    
        String ATR = "";
        try 
        
            // Show the list of available terminals
            TerminalFactory factory = TerminalFactory.getDefault();

            List<CardTerminal> terminals = factory.terminals().list();
            if (terminals.size() == 0) 
            
                LOGGER.error("No Swipe Card Terminals Found");
                return null;
            

            //System.out.println("Terminal: " + terminals.get(0).getName());
            // Get the first terminal in the list
            CardTerminal terminal = terminals.get(0);

            if(terminal.isCardPresent())
            
                // Establish a connection with the card using
                // "T=0", "T=1", "T=CL" or "*"
                Card theCard = terminal.connect("*");

                // Get ATR
                byte[] baATR = theCard.getATR().getBytes();
                ATR = SwipeCardUtil.byteArrayToHexString(baATR);
                //System.out.println("ATR: " + ATR);
                // Disconnect
                // true: reset the card after disconnecting card.
                theCard.disconnect(true);
             
            else
                 return null;
             

         
        catch (Exception ex) 
            LOGGER.error("No Card Reader Connected. Please connect a Card Reader and try again. "+ex.toString());
            ex.printStackTrace();
        
        return ATR;
    

    /**
     * @param theBytes
     * @return theByteArray as a hex string
     */
    public static String byteArrayToHexString(byte[] theBytes)          
                 
        StringBuffer sb = new StringBuffer(theBytes.length * 2);             

        for (int i = 0; i < theBytes.length; i++) 
                       
            int byteToRead = theBytes[i] & 0xff;               
            if (byteToRead < 16) 
                             
                sb.append('0');               
                           
            sb.append(Integer.toHexString(byteToRead));          
                     
        return sb.toString().toUpperCase();          
     

【问题讨论】:

除编程语言外,这可能与Write on a NFC tag using simple php form 重复。 虽然我不同意这是重复的,但我同意您对该问题的回答也回答了我的问题。看起来我需要研究编写一个 Java Applet 来尝试完成我需要做的事情。感谢您的输入迈克尔。我很感激。 【参考方案1】:

您的客户端是 Web 浏览器,而您的 Web 应用程序部署在远程服务器上。从客户端获取阅读器数据的唯一方法是实现一个在客户端运行的软件。 有几种方法可以做到这一点,但许多方法不会在客户端的 Web 浏览器上运行。

您可以尝试实现一个小程序,但该小程序没有足够的权限访问客户端硬件的可能性很高。要提升小程序权限,它必须由浏览器信任的 CA 签名。这是一项相当大的努力。

另一种方法是完全不使用网络浏览器,而是实现富客户端软件。但这与之前的建议一样痛苦,因为整个 productbis 基于瘦客户端/Web 浏览器概念。

也许您可以使用单点登录方法。如果用户在 Windows 机器上并使用他们的帐户登录,您可以使用 waffle。

【讨论】:

感谢 Hannes,但 SSO 在这种情况下将不起作用,因为这些工作站的 Windows 登录是由它们所属的生产线设置的,需要登录到不同屏幕的几个不同的人应用。看起来我需要尝试编写一个 Java Applet 并让它由 CA 签名。感谢您的意见,我很感激。 我知道这篇文章已经有 3 年了,但是@steve.westfall,你最后做了什么?我和你有同样的问题,但是不再支持 Java 小程序。 嗨@Benji Weiss,我们使用的解决方案确实是一个java小程序。对小程序的调用是使用 javascript 进行的。我们使用自签名证书对其进行了签名,但也不得不使用降级的 java 版本来解决浏览器安全问题。我们不得不在每个工作站手动接受安全异常。该系统是一个完全内部网络,与任何外部互联网访问隔离开来。希望这会有所帮助。 @steve.westfall 啊哈我明白了。谢谢回复。不幸的是,我试图通过使用 Internet 来实现这一点,并且任何用户都能够导航到我的站点并使用他们自己的智能卡使用智能卡功能。我做的研究越多,我就越接近原生应用程序或浏览器插件 嗨,很抱歉两年后提出这个问题,但是由于几年前我已经完成了整个小程序,我很好奇现在这个问题的解决方案是什么,特别是考虑到不再支持该小程序。提前谢谢!

以上是关于Java Web 应用程序可以访问远程工作站上的智能卡读卡器吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何建立远程桌面服务Web访问端口

我可以让 SSH ForwardAgent 和 ProxyJump 与 Git 一起工作吗?

Sharepoint 2010 - 获取子网站上的所有组名

无法访问部署在远程JBoss上的Web应用程序

谷歌零信任远程访问产品正式商用,离“消灭虚拟私有网络”还有多远?

谷歌零信任远程访问产品正式商用,离“消灭虚拟私有网络”还有多远?