pkcs11_tpm - 可信平台模块 (Trusted Platform Modules, TPM) 的 OASIS PKCS#11 令牌
/usr/lib/security/pkcs11_tpm.so
/usr/lib/security/64/pkcs11_tpm.so
pkcs11_tpm.so 对象使用可信计算组协议与 TPM 安全设备对话,从而实现 OASIS PKCS#11 加密令牌接口 (Cryptographic Token Interface, Cryptoki) v2.40 规范。此提供器实现了 PKCS#11 规范并使用了 pkg:/library/security/trousers 软件包中的 TCG 软件堆栈 (TCG Software Stack, TSS) API。
应用程序开发者应链接到 libpkcs11.so.1,而不是直接链接到 pkcs11_tpm.so。请参见 libpkcs11(3LIB)。
实现了以下加密算法:RSA、SHA1 和 MD5。
除以下函数之外,实现了 libpkcs11 (3LIB) 中列出的所有标准 PKCS#11 函数:
C_EncryptUpdate C_EncryptFinal C_DecryptUpdate C_DecryptFinal C_DigestEncryptUpdate C_DecryptDigestUpdate C_SignEncryptUpdate C_DecryptVerifyUpdate C_GetFunctionStatus C_CancelFunction C_WaitForSlotEvent C_GenerateKey C_DeriveKey
支持以下 OASIS PKCS#11 v2.40 机制:
CKM_RSA_PKCS_KEY_PAIR_GEN CKM_RSA_PKCS CKM_RSA_PKCS_OAEP CKM_RSA_X_509 CKM_MD5_RSA_PKCS CKM_SHA1_RSA_PKCS CKM_SHA_1 CKM_SHA_1_HMAC CKM_SHA_1_HMAC_GENERAL CKM_MD5 CKM_MD5_HMAC CKM_MD5_HMAC_GENERAL
pkcs11_tpm 提供者只能用于安装有 TPM 设备和 pkg:/library/security/trousers 软件包并已启用 svc:/application/security/tcsd 服务的系统上。系统管理员还必须使用 tpmadm(8) 取得 TPM 的所有权,然后将其作为加密框架 PKCS#11 提供者启用:
# pkg install pkcs11_tpm # svcadm enable svc:/application/security/tcsd # tpmadm init Enter TPM Owner PIN: Confirm TPM Owner PIN: # cryptoadm install provider='/usr/lib/security/$ISA/pkcs11_tpm.so'
如果满足这些先决条件,用户可以使用 pktool(1) 创建自己的专用令牌,这样他们能够使用 TPM 设备执行操作并通过 TPM 保护的密钥保护自己的专用数据。
要准备并初始化用户的 TPM 令牌,必须执行以下步骤:
初始化令牌。
设置 SO(security officer,安全官) PIN(Personal Identification Number,个人识别码)。
设置用户的唯一 PIN。
令牌初始化是使用 pktool(1) 命令执行的,如下所示:
$ pktool inittoken currlabel=TPM newlabel=tpm/myname
缺省情况下,未初始化的 TPM 按名称 TPM 识别。当用户初始化自己的专用令牌时,可以将其重命名为某一其他名称(例如,tpm/joeuser)或保留为 TPM(在这种情况下,将省略 newlabel 参数)。
用户必须提供缺省的 SO PIN 才能初始化其令牌。缺省 SO PIN 为 87654321。在上述步骤 2 中更改该 PIN。
在初始化令牌之后,必须更改 SO 和用户 PIN 的缺省值。同样,可使用 pktool(1) 更改这些 PIN 值。
更改 SO PIN:
$ pktool setpin token=tpm/joeuser usertype=so
The usertype=so option indicates that this “setpin” operation is to change the SO PIN and must be present.随后,用户必须输入缺省的 SO PIN (87654321) 并输入(和确认)新的 PIN。
在重置了 SO PIN 的缺省值后,还必须更改用户的唯一 PIN。
更改用户的 PIN:
$ pktool setpin token=tmp/joeuser
非 SO 用户的缺省 PIN 是 12345678。用户必须输入缺省 PIN 并输入(和确认)新的唯一 PIN。
为 pktool setpin 操作提供的 PIN 或通过调用 C_Login() 和 C_SetPIN() 函数提供的 PIN 可以是长度介于 1 到 256 之间且不带嵌入空字符的任何字符串。
在用户初始化令牌之后,即可通过以下方法来开始使用该令牌:使用 pktool(1),或者通过编写 PKCS11 应用程序并使用前面创建的名称(在上例中为 tpm/joeuser)来定位该令牌。
示例:
$ pktool gencert token=tpm/joeuser -i $ pktool list token=tpm/joeuser
pkcs11_tpm.so 在文件系统特定的令牌对象存储区域提供对象存储。专用对象由使用专用密钥的加密进行保护,只能通过将令牌的专用密钥装入 TPM 并完全在 TPM 中执行解密的方式进行解密。用户的专用密钥由 TPM 在用户设置其个人 PIN(请参见上文)时生成。SO 和用户的密钥都存储在 TSS 持久性存储数据库中并由唯一的 UUID 值引用。所有用户令牌都有唯一的 SO 密钥和唯一的用户密钥,因此一个用户令牌的 PIN 无法解锁同一计算机上其他用户令牌的专用数据。
每个 TPM 都是唯一的,在一个 TPM 上创建的令牌密钥不能用于其他 TPM。pkcs11_tpm.so 令牌数据完全由 TPM 所在的系统进行管理并且不能移到其他系统上。如果 TPM 重置且 SRK(Storage Root Key,存储库根密钥)发生更改,则以前为该 TPM 生成的所有密钥都将不再有效。
pkcs11_tpm.so 将创建一个专用工作区来管理每个已创建令牌的管理文件。缺省情况下,此区域创建为 /var/user/$USERNAME/tpm/。不过,用户可以覆盖此区域,方法是在初始化或使用令牌之前设置 PKCS11_TPM_DIR 环境变量。
在 OASIS PKCS#11 v2.40 规范中定义并列出了其中每个已实现函数的返回值。See https://www.oasis-open.org/committees/pkcs11/.
用户的缺省令牌对象存储。
备用令牌对象存储。
有关下列属性的说明,请参见 attributes(7):
|
pktool(1)、libpkcs11(3LIB)、attributes(7)、cryptoadm(8)
https://trustedcomputinggroup.org/work-groups/software-stack/