什么是可能的客户端架构,从一个普通的浏览器(通过HTTP(S)连接到服务器)访问本地智能卡,最好是从Javascript,以最小的安装麻烦,为最终用户? 服务器需要能够将其选择的至少发出的APDU到卡(或者委派一些,要它生成的客户端代码)。 我在工作的PC / SC堆栈,完成与智能卡阅读器的客户端假设可用性。 这是自XP,现代OS X和Unix系统中至少一个合理的假设上的Windows。
我迄今所查明的下列选项:
- 一些自定义的ActiveX。 这是我现有的应用程序使用什么(我们开发它内部),部署是与IE客户端很容易,一旦他们得到安装ActiveX的间隙,但它不符合“通用浏览器”的要求。
更新 :ActiveX是由弃用IE,包括IE11支持大部分; 但不是由边缘。 - 使用Netscape浏览器插件API一些PC / SC浏览器扩展,这似乎是在上述的一个平滑延伸。 唯一的现成的一个我所在的SConnect ,但似乎勉强活着 ,它的API 文档(webarchive)不再正式面市,它有一个特定的智能卡供应商的紧密联系。 其原理可能是好的,但作出这样的插件,为各种平台将是一个很大的工作。
更新 :NPAPI支持是由许多浏览器,包括Chrome和Firefox下降。 - Java小应用程序,Oracle的JVM(1)6或更高,附带上运行
javax.smartcardio
。 这是从功能上看罚款,有据可查的,我可以用几个已知的bug生活,但恐怕难以抗拒的向下螺旋的关于接受的Java作为一种浏览器的扩展功能。
任何其他的想法?
另外:是有一些方法,以防止任何PC / SC的滥用界面中的浏览器有一个流氓服务器(例如呈现3个错PIN码来阻止卡,只是为了它的龌龊;或做一些更邪恶的东西)。
Answer 1:
更新 (二千〇一十六分之八):用于称为Web的新API WebUSB API正在讨论中。 你可以已经在Chrome V54 +使用它 。
该标准将在所有主要的浏览器来实现,并且将取代第三方应用程序或扩展Smard卡:-)需要
因此,新的答案是肯定的!
和OSI样的架构堆栈是:
- PC / SC
- CCID V1.1
- WebUSB API
- USB驱动程序, 即libusb的 。
注:谷歌annonced,他们将放弃Chrome应用在2017年。
上一页anwser:
现在(2015年),可以创建一个谷歌Chrome应用,使用chrome.usb
API 。
然后,你通过它访问智能卡读取器符合CCID标准的接口。
这不是跨浏览器的JavaScript,但可编程和跨平台的。
反正Netscape浏览器插件API(NPAPI)不被现代浏览器支持了。 和Java小程序正在被浏览器厂商驳回。
Answer 2:
事实是,浏览器无法说话(加密),智能卡用于其他目的,而不是建立SSL。
您应该需要额外的代码,由浏览器执行,访问智能卡。
有几十定制的和专有的插件(使用你所提到的所有三个选项)用于各种目的(签约是最流行的,我猜)建,因为没有标准或普遍接受的方式,至少在欧洲,我敢肯定其他地方为好。
创建,发布和维护自己应该是一个爆炸,因为浏览器发布每隔一个月左右和每一个新版本变化sanboxing IR UI技巧,所以你可能需要经常调整你的代码。
你可能会想有GUI的功能,至少在询问用户的权限访问卡或它的一些功能。
为了创建一个多平台,多浏览器插件,像firebreath都可以使用。
就个人而言,我不认为暴露PC / SC到互联网是什么好。 PC / SC本质上是qute低级别协议,揭露这个时候,你可能也暴露你的磁盘块级访问,并希望“在网络上的应用是只属于我和他们表现良好”(这应该回答你“也“)。 与此同时薄垫片像SConnect是最容易创造,提供一个javscript plugin.sendAPDU() - 样式代码(或只是包装的所有PC / SC API,让JavaScript的调用者采取的细节同级别的护理如在天然PC / SC API的使用情况)。
创建用于此目的的插件通常是由急性当前缺乏驱动。
应对未来(手机等),则是另一回事,这里的东西像W3C webcrypto和OpenMobile API可能会最终以某种方式创造的东西,公开客户端密钥容器到Web应用程序。 如果使用智能卡你的目标是密码,我的建议是为了避免PC / SC和使用平台服务(CryptoAPI的Windows上,钥匙扣上OSX,Linux上的PKCS#11)
任何一种设计有要求。 这一切都适用,如果你想使用的密钥 ,而不是任意的APDU-S的。 如果你的要求是发送任意APDU-S,确实创造了一个插件,只是去用它。
Answer 3:
我刚刚发布了一个测试版插件解决这个问题。 这个测试版的代码可以在这里找到:
https://github.com/ubinity/webpcsc-firebreath
这个插件是基于firebreath框架,并已Beta测试在Linux / WinXP中/ Win7的与Fireofx和Chrome。 提供源代码和扩展包。
其基本思想是提供一个PCSLite API访问,然后制定在此之上更友好的JS-API。
这个插件正在积极开发的,所以随时发送任何报告和请求。
Answer 4:
关于第一个问题,我有一点希望:无论你用的智能卡功能的一个很小的子集satisied(如签署电子邮件或PDF文件),那么你可以使用一些现成的软件(如PKCS),由最好保持智能卡公司,或者你想更广泛的功能和需要投入相当大的精力在你自己。 当然PCSC的出发点来选择。
至少对你的“也”有一些希望。
1)。注意,某些规格(例如ICAO /德国BSI TR-3110)请求的方法,其中PIN未被阻塞,但只要使用相当长的时间量作为误差计数器回答之前命中1。 最后必须尝试使用不同的命令被激活,否则没有进一步的比较和错误计数器调整完成。
2)通过要求安全的消息简单地保护验证命令。 敏感的应用场合的一切安全的消息,所以第一步一个会话密钥negtiated,这是第二个适用于所有后续命令和响应。 的效果会是这样,该命令被拒绝,由于不正确的MAC进行比较或错误计数器的修改完成之前很久。
Answer 5:
还有另外一个浏览器插件类似于在现有@cslashm提出了一个http://github.com/cardid/WebCard 。 也是开源的,并且可以与在原来的问题需要“最小安装麻烦”进行安装。 你可以看到使用来访的例子http://plugin.cardid.org
WebCard已经在IE 8至11,Chrome和Firefox进行了测试在Windows和Chrome和Safari在Mac OS X由于仅仅是PC / SC的包装它在Mac OS X需要智能卡服务从安装HTTP:// smartcardservices.macosforge.com
Answer 6:
随着Chrome和Firefox会阻止NPAPI插件的支持,就可以保持智能卡阅读会话,而不是你的卡的证书有相互支持SSL没有安全的解决方案,我回答了类似的问题来源 ,它可能救命
Answer 7:
它脏,但如果客户机上其可以接受的/有活力安装桥守护程序/服务,那么你可以写通过REST接口暴露的智能卡本地桥服务(如在python / pyscard),那么就得在JavaScript浏览器,本地服务(正面)和远程服务器之间的API调解。
Answer 8:
在谈到浏览器,你现在可以使用智能卡连接器的应用由谷歌提供其捆绑PC / SC-精简版端口和通用CCID驱动程序。
该应用程序本身的工作原理通过chrome.usb API ,这是由先前的评论者提及。
因此,而不是重写整个堆栈(从最低级别开始 - 生USB),它现在开发人员能够编写仅在PC / SC API的顶级作品的一部分 - 这是由连接器应用程序暴露。
Answer 9:
客户端,客户端,客户端插件... .. JSApis ..嗯..对于某些我们知道这一点:所有的浏览器,传达给Apache或IIS服务器时,实际上是在签署“ 东西 ”时,HTTPS / SSL握手过程需要。
例如,一个典型的Apache配置是这样的:
SSLVerifyClient require
SSLVerifyDepth 10
SSLOptions +FakeBasicAuth +StdEnvVars +ExportCertData +OptRenegotiate
启动密码键盘弹出,用户必须插入智能卡销去。
好了,我的想法是:为什么不把转向服务器,并调整这种行为,就是为了能上传的东西字节流签署某些东西时,握手initiaded?
Answer 10:
我有一个地方智能卡读取器进行扫描,以登录用户的设置。 在PC / SC图书馆工作的桌面巨大。 有人曾提到使用Emscripten( https://github.com/kripken/emscripten )编译器来编译的C ++入JavaScript代码。 但由于一些功能正在使用的电脑,没有工作/ SC只提供服务器端。 经过大量的研究。 我终于放弃了在客户端解决方案,Chrome网上应用USB API也无法识别读卡器。
于是我决定给signalR一个尝试,建立连接到智能卡阅读器的PC上的轮毂和这种方法的表现还算不错。
Answer 11:
使用浏览器扩展访问智能卡或USB令牌
Java小程序,Active X的,等等都已经淘汰或正在从新的现代浏览器淘汰。 最近很多正在谈论WebCrypto API,但截至目前,WebCrypto API不提供访问(Windows)或任何其他主要的商店或当地的加密USB /智能卡设备。
对于使用数字签名和PDF或eReturn签署从浏览器认证,提供这样一个免费的Chrome扩展程序是Signer.Digital Chrome扩展程序。 本地系统(主机上运行Chrome浏览器Windows后面)设置可从以下网址下载https://signer.digital/downloads/Signer.Digital.Chrome.Host.Setup.zip安装该主机并重新启动Chrome会自动添加Signer.Digital Chrome扩展
这个扩展的实际工作中说明这里
测试步骤:
安装的设备驱动程序的USB令牌或智能卡 - 这应该让你的证书Windows证书存储区
安装设置上面所指出的。
重新启动Chrome浏览器。
打开此链接
把用户名和密码,然后点击注册按钮-这将要求选择数字签名和注册它在服务器上(对于这届唯一的-不是永久性的)。
然后又把相同的用户名和密码,并选择相同的证书,然后点击登录 。 选择不同的证书将不允许登录。
JavaScript从分机呼叫方法:
为了服务器上注册证书:
//Get Selected Certificate Information
SignerDigital.getSelectedCertificate()
.then(
function (CertInfo) {
//Success returns Certificate Subject and Thumbprint
},
function (errmsg) {
//Send errmsg to server or display the result in browser.
}
);
为了验证或登录使用数字签名:
SignerDigital.signAuthToken(authToken, "SHA-256") //or "SHA256"
.then(
function (SignData) { //Success returns Signed Auth Token
},
function (errmsg) {
//Send errmsg to server or display the result in browser.
}
);
要签署PDF:
//Calculate Sign for the Hash by Calling function from Extension SignerDigital
SignerDigital.signPdfHash(hash, $("#CertThumbPrint").val(), "SHA-256") //or "SHA256"
.then(
function (signDataResp) {
//Send signDataResp to Server
},
function (errmsg) {
//Send errmsg to server or display the result in browser.
}
);
如果失败:返回错误味精开始“SDHost错误:”
Answer 12:
这个问题的另一个解决方案被称为FortifyApp你可以看到它是如何工作在这里 。
TL; DR; 它是一个客户端安装应用程序,在OSX,Windows和Linux上通过网络加密填充工具也可以向其他证书/密钥存储提供的访问暴露出的智能卡工作。
文章来源: Architectures to access Smart Card from a generic browser? Or: How to bridge the gap from browser to PC/SC stack?