opencryptoki/opencryptoki
GitHub: opencryptoki/opencryptoki
PKCS#11 标准的开源实现,为 Linux 和 AIX 提供统一的加密令牌访问接口,支持 IBM 硬件加密设备和软件令牌。
Stars: 150 | Forks: 61
[](https://app.travis-ci.com/opencryptoki/opencryptoki)
[](https://scan.coverity.com/projects/opencryptoki-opencryptoki)
# openCryptoki
软件包版本 3.26
有关特定版本的信息,请参阅 [ChangeLog](ChangeLog)。
## 概述
openCryptoki 版本 3.26 实现了 PKCS#11 规范版本 3.0
以及部分版本 3.1。
此软件包包含几个加密令牌:
CCA, ICA, TPM, SWToken, ICSF 和 EP11。
有关 openCryptoki 的更深入概述,请参阅手册
[openCryptoki - An Open Source Implementation of PKCS #11](https://www.ibm.com/docs/en/linux-on-systems?topic=support-opencryptoki-open-source-pkcs-11)
**注意:** TPM 令牌已被弃用,因为它仅支持 TPM 版本 1.2。
不适用于 TPM 版本 2.0。我们计划在未来的 openCryptoki 版本中移除 TPM 令牌。
AIX 仅支持 CCA 和软件令牌,并且两者都在默认构建配置中启用。其他令牌不受支持且无法强制启用,即使通过 `configure` 工具也不行。
## 需求:
### 通用
构建 opencryptoki 需要以下工具。
- flex
- bison
- make
- autoconf
- automake
- pkg-config
- libtool
- m4
- openldap-devel
- openssl-devel
- libcap-devel (仅限 Linux)
- systemd-devel (仅限 Linux)
这些库通常由您平台的包管理工具提供。在 AIX 上,必须从 AIX Toolbox 仓库安装它们。
### 令牌
- IBM ICA - 需要 libica 库版本 3.3.0 或更高版本,以便在 IBM zSeries 上访问 ICA 硬件加密。
- IBM CCA - 需要 CCA 主机库版本 7.1 或更高版本,以及 IBM Z 上的 IBM Crypto CEX3C 卡(或更高版本)。在 AIX、Linux on x64 和 Linux on Power 上,仅支持 IBM CEX7S (4769) 加密卡。在所有平台上,此令牌都需要 `lber` 库,该库通常是 `openldap` 包的一部分。
- TPM (**已弃用**) - 需要 TPM, TPM 工具, 和 TCG 软件栈。仅支持 TPM 版本 1.2。
- SWToken - 软件令牌使用 OpenSSL 版本 1.1.1 或更高版本。此令牌需要 `lber` 库,该库通常是 openldap 的一部分。
- ICSF - Integrated Cryptographic Service Facility (ICSF) 令牌需要 openldap 和 openldap 客户端软件版本 2.4.23 或更高版本。构建此令牌还需要 Lex 和 Yacc。
- EP11 - EP11 令牌是使用配置了 Enterprise PKCS#11 (EP11) 固件的 IBM Crypto Express 适配器(从 Crypto Express 4S 适配器开始)的令牌。
## 构建过程
**注意:** 在 AIX 上构建 opencryptoki 仅支持 AIX 7.2 及更高版本。
尝试在较旧的 AIX 版本上构建将因缺少 API 而失败。
编译此软件包最简单的方法是进入源代码主目录并执行以下操作:
1. 通过键入以下命令运行 bootstrap.sh 脚本:
```
$ ./bootstrap.sh
```
**注意:** 此软件包使用 autoconf 归档中的 `AX_PROG_CC_FOR_BUILD` autoconf 宏来支持交叉编译器构建。
如果您的系统不提供此宏,您可能需要安装 `autoconf-archive` 包或将该宏下载并放入 `m4` 目录。请参阅 [此处](https://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html) 获取 `ax_prog_cc_for_build.m4` 最新版本的链接。
2. 通过键入以下命令配置源代码:
```
$ ./configure
```
如果您计划将软件包安装到您的主目录或 `/usr/local` 以外的位置,请在 `configure` 中添加标志 `--prefix=PATH`。例如,如果您的主目录是 `/home/luser`,您可以通过调用来配置软件包以将其安装在那里:
```
$ ./configure --prefix=/home/luser
```
如果您的 stdll 头文件和库不在任何标准路径下,您需要将文件路径传递给配置脚本。
**注意:** 在 AIX 上编译时,必须将 `CFLAGS` 和 `LDFLAGS` 设置为可以正确找到 openldap 库和头文件的正确路径。如果使用 [AIX Toolbox](https://www.ibm.com/support/pages/aix-toolbox-open-source-software-downloads-alpha#O) 中的 `openldap-devel` 包,则必须在调用 `./configure` 之前或同时将 `CFLAGS` 和 `LDFLAGS` 分别设置为 `-I/opt/freeware/include` 和 `-L/opt/freeware/lib`。例如,
```
$ CPPFLAGS="-L/path/lib" LDFLAGS="-I/path/include" ./configure
```
有关各种选项的信息,请参阅 `./configure --help`。默认行为是构建所有满足前提条件的令牌。ICA 和 EP11 令牌只能在 s390x 上构建,因为这是唯一满足前提条件的平台。在 AIX 上,只能构建 CCA 和软件令牌。如果提供了适当的库且令牌在您编译的平台上受支持,其他令牌可以使用相应的 `--enable-` 配置选项启用。
在运行时,`configure` 会打印一些消息,告知它正在检查哪些功能。
**注意**:在 AIX 上,如果您希望运行 `make distcheck`,环境变量 `DISTCHECK_CONFIGURE_FLAGS` 必须包含 `CFLAGS` 和 `CXXFLAGS` 的适当值。
3. 通过键入以下命令编译软件包:
```
$ make
```
**注意:** 不要在 `make` 调用中指定 `prefix=/foo/bar`, `libdir=/foo/bar`。请在 `configure` 中指定它们。openCryptoki 软件包不支持在 `make` 中指定它们,可能会产生意外结果!
4. openCryptoki 默认允许 ``pkcs11`` 组中的任何人使用。
在安装之前,通过以 root 身份键入以下命令添加 pkcs11 组:
```
# groupadd pkcs11
```
此外,将必要的用户添加到 pkcs11 组(root 不需要在 pkcs11 组中):
```
# usermod -a -G pkcs11
```
5. 键入 `make install`(以 root 身份)以安装程序和任何数据文件及文档。在安装期间,以下文件将放入以下目录:
```
${prefix}/sbin/pkcsconf
${prefix}/sbin/pkcsslotd
${prefix}/sbin/pkcsicsf
${prefix}/libdir/libopencryptoki.so
${prefix}/libdir/libopencryptoki.so.0
${prefix}/libdir/opencryptoki/libopencryptoki.so
${prefix}/libdir/opencryptoki/libopencryptoki.so.0
${prefix}/libdir/opencryptoki/libopencryptoki.so.0.0.0
${prefix}/var/lib/opencryptoki
${prefix}/etc/opencryptoki/opencryptoki.conf
```
可选构建的令牌对象将放入以下位置:
```
${prefix}/libdir/opencryptoki/stdll/libpkcs11_cca.so
${prefix}/libdir/opencryptoki/stdll/libpkcs11_cca.so.0
${prefix}/libdir/opencryptoki/stdll/libpkcs11_cca.so.0.0.0
${prefix}/libdir/opencryptoki/stdll/libpkcs11_ep11.so
${prefix}/libdir/opencryptoki/stdll/libpkcs11_ep11.so.0
${prefix}/libdir/opencryptoki/stdll/libpkcs11_ep11.so.0.0.0
${prefix}/libdir/opencryptoki/stdll/libpkcs11_ica.so
${prefix}/libdir/opencryptoki/stdll/libpkcs11_ica.so.0
${prefix}/libdir/opencryptoki/stdll/libpkcs11_ica.so.0.0.0
${prefix}/libdir/opencryptoki/stdll/libpkcs11_icsf.so
${prefix}/libdir/opencryptoki/stdll/libpkcs11_icsf.so.0
${prefix}/libdir/opencryptoki/stdll/libpkcs11_icsf.so.0.0.0
${prefix}/libdir/opencryptoki/stdll/libpkcs11_sw.so
${prefix}/libdir/opencryptoki/stdll/libpkcs11_sw.so.0
${prefix}/libdir/opencryptoki/stdll/libpkcs11_sw.so.0.0.0
${prefix}/libdir/opencryptoki/stdll/libpkcs11_tpm.so
${prefix}/libdir/opencryptoki/stdll/libpkcs11_tpm.so.0
${prefix}/libdir/opencryptoki/stdll/libpkcs11_tpm.so.0.0.0
```
其中 `prefix` 是 `/usr/local` 或您在 `--prefix` 标志中指定的 PATH。`libdir` 是库目录的名称,对于 32 位库通常是 `lib`,对于 64 位库通常是 `lib64`。
为了保持向后兼容性,生成了一些额外的符号链接(请注意,这些已弃用,应用程序应迁移以使用符合 LSB 的库名称和可执行文件位置):
```
${prefix}/lib/opencryptoki/PKCS11_API.so
- Symlink to ${prefix}/lib/opencryptoki/libopencryptoki.so
${prefix}/lib/opencryptoki/stdll/PKCS11_CCA.so
- Symlink to ${prefix}/lib/opencryptoki/stdll/libpkcs11_cca.so
${prefix}/lib/opencryptoki/stdll/PKCS11_EP11.so
- Symlink to ${prefix}/lib/opencryptoki/stdll/libpkcs11_ep11.so
${prefix}/lib/opencryptoki/stdll/PKCS11_ICA.so
- Symlink to ${prefix}/lib/opencryptoki/stdll/libpkcs11_ica.so
${prefix}/lib/opencryptoki/stdll/PKCS11_ICSF.so
- Symlink to ${prefix}/lib/opencryptoki/stdll/libpkcs11_icsf.so
${prefix}/lib/opencryptoki/stdll/PKCS11_SW.so
- Symlink to ${prefix}/lib/opencryptoki/stdll/libpkcs11_sw.so
${prefix}/lib/pkcs11/PKCS11_API.so
- Symlink to ${prefix}/lib/opencryptoki/libopencryptoki.so
${prefix}/lib/pkcs11
- Directory created if non-existent
${prefix}/lib/pkcs11/methods
- Symlink to ${prefix}/sbin
${prefix}/lib/pkcs11/stdll
- Symlink to ${prefix}/lib/opencryptoki/stdll
${prefix}/etc/pkcs11
- Symlink to ${prefix}/var/lib/opencryptoki
```
如果这些目录目前不存在,它们将根据需要创建。请注意,如果 `prefix` 是 `/usr`,则 `${prefix}/var` 和 `${prefix}/etc` 解析为 `/var` 和 `/etc`。在 `make install` 阶段,如果旧 `${prefix}/etc/pkcs11` 目录中存在内容,它将被迁移到新的 '${prefix}/var/lib/opencryptoki` 位置。
如果您安装在主目录中,请确保 `/home/luser/bin` 在您的路径中。如果您使用 bash shell,请在 `.bashrc` 文件末尾添加此行:
```
PATH="/home/luser/bin:${PATH}"
export PATH
```
如果您使用 csh 或 tcsh,则改用此行:
```
setenv PATH /home/luser/bin:${PATH}
```
通过将主目录前置于 PATH 的其余部分,您可以用自己的自定义安装覆盖系统范围的已安装软件。
有关更多安装信息,请查看 [INSTALL](INSTALL)。
## 配置
参见:
https://www.ibm.com/support/knowledgecenter/linuxonibm/com.ibm.linux.z.lxce/lxce_stackoverview.html
在版本 3 之前,openCryptoki 使用 `pk_config_data` 作为其配置文件。该文件在运行 `pkcs11_startup` 时创建。在版本 3 中,`pkcs11_startup` 和 `pk_config_data` 已被移除,并替换为一个名为 `opencryptoki.conf` 的可自定义配置文件。它包含 openCryptoki 当前支持的每个令牌的条目。但是,只有那些在本地系统上具备硬件和软件要求的令牌才会在运行 `pkcsconf -t` 命令时显示为存在且可用。
在使用之前,必须先初始化每个令牌。您可以使用 `-c` 命令行选项选择令牌;有关更多说明,请参阅上面链接的文档。
通过运行 `pkcsconf` 初始化特定令牌:
```
$ pkcsconf -I -c
```
在此版本的 openCryptoki 中,默认的 SO PIN 是 `87654321`。这应该在使用前更改为不同的 PIN 值。
您可以通过运行 pkcsconf 更改 SO PIN:
```
$ pkcsconf -P -c
```
您可以通过键入以下命令初始化和更改用户 PIN:
```
$ pkcsconf -u -c
```
您可以稍后通过键入以下命令再次更改用户 PIN:
```
$ pkcsconf -p -c
```
## 贡献
参见 [CONTRIBUTING.md](CONTRIBUTING.md)。
标签:AIX, CCA, EP11, HSM, HTTP工具, IBM加密硬件, ICA, ICSF, OpenCryptoki, Open Source, PKCS#11, SamuraiWTF, TPM 1.2, zSeries, 加密API, 加密库, 子域名枚举, 安全测试工具, 客户端加密, 密码学, 底层库, 手动系统调用, 硬件安全模块, 系统安全, 软件令牌