标题:
Linux 上的 PKCS #11 openCryptoki API -简介
[打印本页]
作者:
look_w
时间:
2018-4-15 20:30
标题:
Linux 上的 PKCS #11 openCryptoki API -简介
openCryptoki 是什么?openCryptoki 是 PKCS #11 API 的一种实现,它允许建立到保存了密码信息并执行密码功能的设备(譬如智能卡、智能磁盘或者 PCMCIA 卡)的接口。openCryptoki 通过将应用程序从密码设备细节的分离来提供应用程序的可移植性。应用程序的隔离还提供了添加的安全性层,因为所有的密码信息驻留在设备里。openCryptoki API 提供了应用程序和各种可移植密码设备之间的标准编程接口。
体系结构概述openCryptoki 由槽(slot)管理器以及槽令牌动态链接库(STDLL)的 API 组成。槽管理器作为守护进程来运行以控制向应用程序提供的令牌槽数,并且使用一个共享内存区域与应用程序交互。每个设备有一个相关联的令牌并将令牌插入到槽管理器数据库中的一个槽。共享内存区域允许在应用程序之间进行状态信息的适当共享以帮助确保与 PKCS #11 规范保持一致。
槽管理器槽管理器守护进程( pkcsslotd )管理系统中的槽(因此也包括令牌)。固定数量的进程可以被附加到 pkcsslotd ,因此将使用共享内存中的一个静态表。当前对表的限制是最多 1000 个进程可以使用子系统。守护进程在初始化时设置将这个共享内存并在其后扮演垃圾收集器的角色以确保只有活动进程保持注册。当一个进程附加到一个槽并打开一个会话, pkcsslotd 将告知后来的进程已有一个会话打开并将锁定特定的函数调用,如果它们需要独占地访问给定令牌的话。守护进程不断地搜索它在共享内存中的区域以确定附加到令牌的进程真的在运行。如果一个附加的进程异常终止, pkcsslotd 将在那个进程之后“打扫干净”并释放槽供其它进程使用。
主 APISTDLL 的主 API 位于 /usr/lib/pkcs11/PKCS11_API.so 中。这个 API 包含 PKCS #11 API 规范中所描述的所有函数。主 API 为每个应用程序提供槽管理设施。这个 API 还装入特定于令牌的模块(STDLL)来提供特定于令牌的操作(密码操作、会话管理和对象管理)。STDLL 是为每个令牌类型定制的并具有特定函数,譬如初始化例程以允许令牌与槽管理器一起工作。当应用程序用 C_Initialize 调用初始化子系统时,API 将为所有存在于配置中(驻留在共享内存)的令牌装入 STDLL 共享对象并且调用特定于令牌的初始化例程。
槽令牌动态链接库(STDLL)STDLL 是主 API 的插件模块。它们提供超出主 API 函数之外的特定于令牌的函数。可以通过为设备构建 STDLL 来支持特定设备。每个 STDLL 必须至少提供一个特定于令牌的初始化函数。如果该设备是智能设备,譬如支持多种机制的硬件适配器,STDLL 可以变得简单因为设备能存储大多数会话信息。如果设备只执行简单的密码功能,则所有对象必须由软件来管理。这种灵活性使得 STDLL 可以支持任何密码设备。
共享内存槽管理器在共享内存区域设置其数据库。因为允许附加到 pkcsslotd 的进程的最大数目是有限的,所以可以为令牌管理留出固定数量的内存。这块为令牌管理分配的固定内存使得应用程序更容易地访问令牌状态信息并确保和 PKCS #11 规范的一致性。
openCryptoki 的组件本节描述了 openCryptoki 子系统的不同组件。
槽管理器守护进程槽管理器守护程序是一个可执行文件( /usr/sbin/pkcsslotd ),它读取 /etc/pkcs11/pk_config_data ,依照系统中找到的设备安排共享内存。然后 pkcsslotd 继续作为守护进程运行。任何其它试图使用子系统的应用程序必须首先附加到共享内存区域并作为 API 初始化进程的一部分注册,所以 pkcsslotd 知道应用程序。如果 /etc/pkcs11/pk_config_data 被更改了,必须停止 pkcsslotd 并重新启动以读取新的配置文件。守护进程可以通过发出 kill <pkcsslotd config> 命令来停止。如果有任何应用程序正在使用子系统,守护进程将不会终止。
PKCS11_API.so这个库包含主 API( /usr/lib/pkcs11/PKCS11_API.so )并由使用由子系统所管理的任何 PKCS #11 令牌的任何应用程序装入。在应用程序使用令牌之前,它必须装入 API 并调用 C_Initialize ,以符合 PKCS #11 规范。装入操作是通过使用 dlopen 设施的应用程序执行的。
槽令牌 DLL(STDLL)在初始的销售产品中装有三个 STDLL。它们使用两种不同的固件装入(firmware load)来支持 IBM 4758 PCI Cryptographic Coprocessor,以及 IBM Cryptographic Accelerator(ICA),2058 型或 Leeds Lite 卡。
注:
编译进程试图构建目标平台所支持的所有令牌,以及所有需要的支持程序。如果未提供一部分头和库,这些组件将不被构建。
IBM 4758 PCI Cryptographic Coprocessor 支持
IBM 4758 PCI Cryptographic Coprocessor(4758 Coprocessor)是“联邦信息处理标准 4(Federal Information Processing Standards 4(FIPS4))”干扰响应包中的一个可编程密码协处理器。作为一个可编程设备,它可以被赋予多重“人格”。openCryptoki 提供 STDLL 来建立到两种不同的固件装入的接口:deep 和 shallow。
deep 固件装入提供了运行在卡上的完整的 PKCS #11 实现。在这种情况下 STDLL 把主机 PKCS #11 操作转化为传递到卡的命令块。在这种模式下,4758 Coprocessor 的完整安全特性是可用的。API 模块所装入的共享对象是 /usr/lib/pkcs11/stdll/PKCS11_4758.so ;但是没有应用程序需要知道令牌名称因为配置进程为适当的令牌检测和配置子系统。这个装入可从 4758 Coprocessor 网站获得(参阅 )。
shallow 装入没有使用卡的任何安全特性。在这种情况下,STDLL 要复杂的多,提供 PKCS #11 对象和会话管理以及 PKCS #11 规范要求的允许多进程或线程的互操作。API 所装入的模块是 /usr/lib/pkcs11/stdll/PKCS11_LW.so 。这个固件在来自 IBM 的受限基础上可用,并在本质上将 4758 Coprocessor 变成了密码处理器。
IBM Cryptographic Accelerator 2058 型支持
ICA 设备是照 4758 Coprocessor 的 shallow 固件模式建模的。它提供所有的对象和会话管理设施,并将 PKCS #11 机制暴露给应用程序。API 为应用程序装入 /usr/lib/pkcs11/stdll/PKCS11_ICA.so 模块。这个模块唯一的特性就是它利用设备驱动程序提供的透明负载均衡。子系统仅在设备上打开一个,但是驱动程序将负载分布到系统中每个 ICA 设备上。系统中有多个设备时,有一个容错级别。只要系统中还有一个设备在起作用,应用程序将继续起作用但是性能降低。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0