PKCS#11 浏览器接口调查
PKCS#11定义了一个平台无关的API,用于设备如硬件安全模块(HSM)、智能卡等进行加密操作,它是加密设备制造商和加密应用开发者之间的桥梁。
本文针对 PKCS#11 接口如何能被浏览器以及运行于浏览器中的 javascript 代码使用做调查和汇总,认为浏览器直接使用 PKCS#11 接口目前已不可行。建议使用中间件方案或者内嵌方案。
浏览器 P11 接口现状
现代浏览器出于安全考虑,大部分不提供 PKCS#11 接口的直接支持。
Chrome 浏览器无法直接支持
Chrome 45 版本(2015年9月)以前可以通过 NPAPI 直接调用 PKCS#11 接口。但是之后的版本已经废除该功能。
Firefox 浏览器可以在扩展中支持
Mozilla Firefox 所有版本提供了对PKCS#11模块的直接支持,允许用户添加和配置PKCS#11模块,以便与硬件安全模块(HSM)、智能卡等进行交互。
Firefox 需要先在浏览器的配置页面(about:config)中开启 security.pkcs11
相关配置。之后就可以通过pkcs11.addModule
和pkcs11.deleteModule
等JavaScript函数来使用 PKCS#11 的功能,这些函数和浏览器扩展中使用。
中间件方案
为了让 javascript 可以访问PKCS#11 接口,需要在 PKCS#11 接口到浏览器 javascript 之间在加一个中间件。该中间件可以是本地网络服务或者浏览器插件,通过封装接口给 javascript 提供间接访问PKCS#11 接口的能力。
本地网络服务形式可以选使用 https 或 wss 协议通信。
浏览器插件形式通常使用 Native Messaging API 通信。
该方案可以复用已有 PKCS#11 功能,中间件通信封装部分有额外开发量。
内嵌方案
浏览器标准中包含 WebAssembly ,它允许开发者使用 C/C++等语言开发平台无关的功能扩展浏览器的能力。硬件模块提供的功能可以使用 WebAssembly 嵌入到浏览器中执行。
该方案具有较好的跨平台一致性。
方案对比
浏览器直连 P11 | 中间件方案 | 内嵌方案 | |
浏览器兼容性 | 不好 (仅支持Firefox ) | 好 | 较好 (非 IE 内核浏览器) |
跨平台一致性 | 需要每个平台不同的 pkcs11 库支持 | 需要每个平台不同的 pkcs11 库支持 | 跨平台一致 |
开发量 | pcks11库+扩展开发+接口封装 | pcks11库+中间件开发+接口封装 | 功能开发+接口封装 |
数据存储量 | 受限电脑磁盘 | 受限电脑磁盘 | 受限浏览器,数据量不大。 |
客户端集群同步 | 添加独立同步服务可以支持 | 添加独立同步服务可以支持 | 通过服务端中转支持 |
其他相关但不适用的信息
浏览器标准中包含 Web Crypto API ,它允许开发者执行基础的加密操作,如散列、签名生成和验证、加密和解密等。这个API的实现是内嵌在浏览器中无法自行修改。
Java平台提供了Java加密架构(JCA)的PKCS#11 Provider 程序,使得Java应用程序可以通过标准的JCA接口与PKCS#11设备进行交互。