59

从通用浏览器(通过 http(s) 连接到服务器)访问本地智能卡的可能客户端体系结构是什么,最好是从 Javascript,最终用户的安装麻烦最少?服务器至少需要能够向卡发出它选择的 APDU(或者可能将其中的一些委托给它生成的客户端代码)。我假设在工作 PC/SC 堆栈的客户端可用,并配有智能卡读卡器。至少在自 XP、现代 OS X 和 Unix 以来的 Windows 上,这是一个合理的假设。

到目前为止,我已经确定了以下选项:

  1. 一些自定义的 ActiveX。这就是我现有的应用程序使用的(我们内部开发的),一旦获得安装 ActiveX 的许可,对于使用 IE 的客户来说,部署非常容易,但它不符合“通用浏览器”的要求。
    更新:ActiveX 主要由已弃用的 IE 支持,包括 IE11;但不是由边缘。
  2. 一些使用 Netscape Plugin API 的 PC/SC 浏览器扩展,这似乎是上述的平滑扩展。我找到的唯一现成的是SConnect (webarchive)。它不再被推广(更新:认为在 2020 年末至少在一个应用程序中仍在积极维护和使用),它的 API文档(webarchive)不再正式可用,它与特定的智能卡和读卡器供应商有着密切的联系。原理可能很好,但是为每个平台制作这样的插件将是很多工作。
    更新:许多浏览器都放弃了对 NPAPI 的支持,包括 Chrome 和 Firefox。
  3. 一个 Java 小程序,运行在 Oracle 的 JVM (1.)6 或更高版本之上,带有javax.smartcardio. 从功能的角度来看这很好,有据可查,我可以忍受少数已知的错误,但我担心在接受 Java 作为浏览器扩展方面会出现不可抗拒的螺旋式下降。
  4. [更新,2021 年 2 月]:这个答案认为 WebUSB API 在 2015 年是一个很有前途的解决方案,然后在 2019 年报告说不能工作或被放弃。我在那里提出了一个问题。

还有什么想法吗?

另外:有什么方法可以防止恶意服务器滥用浏览器的任何 PC/SC 接口(例如,提供 3 个错误的 PIN 码来阻止卡,只是为了它的肮脏;或者做一些更邪恶的事情)。

4

10 回答 10

27

事实上,除了建立 SSL 之外,浏览器无法与(加密)智能卡进行通信。

需要由浏览器执行的附加代码来访问智能卡。

有数十个自定义和专有插件(使用您提到的所有三个选项)用于各种目的(签名是最受欢迎的,我猜)因为没有标准或普遍接受的方式,至少在欧洲,我敢肯定在其他地方也是。

创建、分发和维护你自己的将是一场爆炸,因为浏览器每个月左右发布一次,每个新版本都会改​​变 sanboxing ir UI 技巧,所以你可能需要经常调整你的代码。

而且您可能希望拥有 GUI 功能,至少是为了请求用户访问卡片或卡片上的某些功能的权限。

要创建多平台、多浏览器插件,可以使用诸如firebreath之类的东西。

就个人而言,我认为将 PC/SC 暴露在网络上没有任何好处。PC/SC 本质上是一个低级协议,当暴露它时,你也可以暴露对磁盘的块级访问,并希望“网络上的应用程序是我的,它们表现良好”(这应该回答你的“也”)。同时,像 SConnect 这样的薄垫片是最容易创建的,用于提供 javscript plugin.sendAPDU() 样式的代码(或者只是包装所有 PC/SC API 并让 javascript 调用者处理相同级别的细节与本地 PC/SC API 用例一样)。

为此目的创建插件通常是由严重的电流不足驱动的。

解决未来(移动等)是另一回事,W3C webcrypto和 OpenMobile API 之类的东西最终可能会以某种方式创建将客户端密钥容器暴露给 Web 应用程序的东西。如果您的智能卡目标是密码学,我的建议是避免使用 PC/SC 并使用平台服务(Windows 上的 CryptoAPI,OSX 上的 Keychain,Linux 上的 PKCS#11)

任何一种设计都有要求。如果您正在考虑使用而不是任意 APDU-s,这一切都适用。如果您的要求是发送任意 APDU-s,请创建一个插件并使用它。

于 2013-04-07T07:40:14.040 回答
25

更新(8/2016):正在讨论一种新的 Web API,称为WebUSB API 。已经可以将它与 Chrome v54+ 一起使用

该标准将在所有主要浏览器中实施,并将取代对第三方应用程序或智能卡扩展的需求:-)

所以新的答案是肯定的!

类似 OSI 的架构堆栈是:

2019 年更新:正如@vlp 评论的那样,它似乎在 Chrome 中不起作用,因为他们出于某些似是而非的原因决定为智能卡阻止 WebUSB :-(


注意:谷歌宣布他们将在 2017 年放弃 Chrome 应用程序。

上一个答案

chrome.usb现在(2015 年),您可以使用API创建 Google Chrome 应用程序。

然后,您可以通过其CCID 兼容接口访问智能卡读卡器。

它不是跨浏览器,而是 JavaScript 可编程和跨平台。

无论如何,现代浏览器不再支持 Netscape Plugin API (NPAPI)。浏览器供应商正在摒弃 Java 小程序。

于 2015-09-24T14:18:21.287 回答
7

我刚刚发布了一个测试插件来解决这个问题。此测试版代码可在此处获得:

https://github.com/ubinity/webpcsc-firebreath

该插件基于 firebreath 框架,并已在 Linux/WinXP/Win7 下使用 Fireofx 和 Chrome 进行了 beta 测试。提供源代码和扩展包。

基本思想是提供一个 PCSLite API 访问,然后在此基础上开发一个更友好的 JS-api。

该插件正在积极开发中,因此请随时发送任何报告和请求。

于 2013-06-03T09:06:03.997 回答
4

对于您的第一个问题,我几乎没有希望:要么您对智能卡功能的一小部分(例如签署电子邮件或 PDF)感到满意,然后您可以使用一些现成的软件(例如 PKCS),最好由智能卡公司,或者您想要更广泛的功能并且需要自己投入大量精力。当然,PCSC 是选择的起点。

至少对你的“也:”有一些希望。

1) 请注意,某些规范(例如,ICAO/德国 BSI TR-3110)要求一种方法,其中 PIN 不会被阻止,但在错误计数器达到 1 时会在回复之前使用大量时间。最后一次尝试必须使用不同的命令启用,否则不会进行进一步的比较和错误计数器调整。

2) 通过要求安全消息传递来简单地保护验证命令。敏感的应用程序对所有内容都使用安全消息传递,因此第一步是对会话密钥进行协商,然后将其应用于所有后续命令和响应。结果是,在错误计数器的比较或修改完成之前很久,由于不正确的 MAC,命令被拒绝。

于 2013-04-04T12:54:42.717 回答
4

在http://github.com/cardid/WebCard上还有另一个类似于 @cslashm 提出的浏览器插件。也是开源的,可以按照原始问题的要求使用“最少的安装麻烦”进行安装。您可以访问http://plugin.cardid.org查看使用示例

WebCard 已经在 IE 8 到 11、Windows 中的 Chrome 和 Firefox 以及 Mac OS X 中的 Chrome 和 Safari 中进行了测试。由于它只是 PC/SC 的包装器,因此它需要在 Mac OS X 中从http://安装 SmartCard 服务smartcardservices.macosforge.com

于 2014-11-16T14:59:09.197 回答
2

由于 chrome 和 firefox 将停止对 NPAPI 插件的支持,因此没有可用于维护智能卡读取会话的安全解决方案,而是您的卡证书支持双向 ssl,我回答了类似的问题来源,它可能帮助

于 2015-12-27T18:19:19.330 回答
1

它很脏,但是如果在客户端机器上安装桥接守护程序/服务可以接受/可行,那么您可以编写一个本地桥接服务(例如在 python / pyscard 中),通过 REST 接口公开智能卡,然后在在本地服务(外观)和远程服务器 API 之间进行调解的浏览器。

于 2016-05-24T13:09:51.233 回答
1

说到 Chrome,您现在可以使用 Google 提供的Smart Card Connector 应用程序,它捆绑了 PC/SC-Lite 端口和通用 CCID 驱动程序。

该应用程序本身通过前面评论者提到的chrome.usb API工作。

因此,无需重写整个堆栈(从最低级别 - 原始 USB 开始),现在开发人员可以只编写在 PC/SC API 之上工作的部分 - 由连接器应用程序公开。

于 2016-07-18T17:27:23.800 回答
1

客户端,客户端,客户端...插件,..JSApis.. 好吧.. 我们肯定知道这一点:所有浏览器在与 Apache 或 IIS 服务器通信时,实际上是在 https/SSL 握手过程中签署“某些东西”需要。

例如,像这样的典型 Apache 配置:

SSLVerifyClient require
SSLVerifyDepth 10
SSLOptions +FakeBasicAuth +StdEnvVars +ExportCertData +OptRenegotiate

启动密码键盘弹出,用户必须插入智能卡密码才能继续。

好吧,我的想法是:为什么不转向服务器,并调整该行为,以便在握手开始时上传内容的字节流以签署某些内容?

于 2017-03-16T10:00:50.127 回答
0

我有一个设置,其中扫描智能卡读卡器以登录用户。PC/SC 库在桌面上工作得很好。有人提到使用 Emscripten ( https://github.com/kripken/emscripten ) 编译器,它将 c++ 编译成 JavaScript 代码。但这并没有很好地工作,因为 PC/SC 使用的某些功能仅在服务器端可用。经过大量研究。我最终放弃了客户端解决方案,chrome web usb API 也无法识别阅读器。
然后我决定尝试 signalR 并在连接到智能卡读卡器的 PC 上设置集线器,这种方法效果很好。

于 2018-02-15T02:25:39.210 回答