从浏览器访问 USB 智能卡数据

Posted

技术标签:

【中文标题】从浏览器访问 USB 智能卡数据【英文标题】:Accessing USB Smart Card data from a browser 【发布时间】:2021-06-05 18:22:21 【问题描述】:

我正在构建一个基于企业浏览器的应用程序,该应用程序可以在带有触摸屏的专用 PC 上运行(可以将其想象成一个信息亭)。因此,应用程序本身是基于 NodeJS 构建的,用户在浏览器上做出选择并插入他们的智能卡。由于 javascript 不能直接读取和解密 Smart Card 数据,因此在这台 PC 上运行的 Java 程序会检测到插入的 Smart Card 并读取数据。现在,问题是将此智能卡详细信息(名称、地址等)发送到 JS 代码。我不太确定如何解决这个问题,以下是一些想法:

    Java 智能卡读卡器在读取数据后,将其作为键盘输入输出。然后 JS 代码监听这个特定的键盘事件并读取所有数据。有点像条形码扫描仪的工作原理。 Java 智能卡读卡器和浏览器连接到云端并建立了 WebSocket 通道。 Java程序读取数据后,推送到云服务器,云服务器再通过WebSockets推送到浏览器。 将 Java 智能卡读卡器作为具有自签名 SSL 证书的 Web 服务器 (localhost) 运行。在 hosts 文件中为服务器添加本地域名。现在,浏览器可以通过 Http API 直接与 Java 网络服务器通信。 使用 gRPC (localhost) 运行 Java 智能卡读卡器,并通过 gRPC-web 将浏览器连接到它。 (我没有使用 gRPC 的经验,但也许这是可能的?)

以上每个都有自己的陷阱。我不确定其他基于 Kiosk 的系统是如何工作的,所以对上述想法的任何建议或改进都会很棒。

【问题讨论】:

【参考方案1】:

这里最好的解决方案可能是在您的 java 应用程序中使用 Jetty 在 127.0.0.1 托管一个 WebSocket,并让您的 javascript 直接连接到那个 。不需要云服务器,因为 WebSocket 没有绑定到同源策略或跨源资源共享。

另一个潜在的解决方案是在您的 java 程序中使用 javafx 的 webkit 或其他 java 浏览器实现嵌入浏览器,并通过它共享数据。这不太理想,因为 javafx 的 webkit 有自己的怪癖,而且用于 java 的商业嵌入式浏览器要花费数千美元。

我会使用 websocket 解决方案。

【讨论】:

哦,太好了。不知道 CORS 不适用于 WS。这似乎是一个安全漏洞,也许浏览器上的未来版本实际上可能会扩展 CORS 策略以应用于 WS。您是否会知道使用 gRPC 是否是一个合适的解决方案(我也编辑了我的问题) 有些人确实认为没有 CORS 是一个安全漏洞,但阻止来自您不想要的域的请求相对简单。它为程序员提供了更大的 IMO 灵活性。 另外,我不太确定 grpc 是什么,但我写了一个很好的文档示例,说明如何在码头中使用 websockets。如果你愿意,我可以链接 github。 谢谢,我碰巧自己也认识一些Netty的WS。话虽如此,这并没有提供更新的解决方案,因为我仍然必须制作自签名证书才能从“https”访问“wss”,然后还要连接到它(localhost)。我避免的唯一步骤是在主机文件中添加条目。

以上是关于从浏览器访问 USB 智能卡数据的主要内容,如果未能解决你的问题,请参考以下文章

从Web浏览器访问智能卡读卡器?

从通用浏览器访问智能卡的架构?或者:如何弥合从浏览器到PC / SC堆栈的差距?

访问网站数据的 Windows 智能卡身份验证

手机端ftp可以通过域名访问,电脑不行

中兴ZXV10 B760E IPTV智能机顶盒 adb 破解安装软件

从浏览器读取智能卡