Mastercard/pkcs11-tools

GitHub: Mastercard/pkcs11-tools

一套类 Unix 风格的命令行工具集,用于在 PKCS#11 兼容的加密令牌上执行密钥生成、证书管理、密钥封装等操作。

Stars: 212 | Forks: 40

# PKCS\#11 工具 pkcs11-tools 是一个工具包,包含一系列小型实用程序,用于在实现 PKCS\#11 接口的加密令牌上执行密钥管理任务。它具有许多类似于 Unix CLI 实用程序的命令,例如 `ls`、`mv`、`rm`、`od` 和 `more`。它还包含用于生成密钥、生成 CSR、导入证书和其他文件的特定命令,其方式兼容大多数实现,包括 IBM 和 Oracle JVM。它还能够与来自 [mozilla.org](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS) 的 NSS 库进行交互。 部分功能: - 支持 DES, 3DES, AES, HMAC, RSA, DSA, DH, 椭圆曲线 (NIST curves, Edwards curves) - 生成 PKCS\#10 (CSR) 和自签名证书 - 导入证书、公钥、数据文件 - 支持对称和非对称密钥的封装与解封装 - 支持在密钥创建、公钥导入、密钥封装和密钥解封装期间使用模板 - 支持会话密钥生成并在单个命令中直接在一个或多个密钥下进行封装 - 支持密钥重封装(即密钥解封装和密钥封装) ## 新闻 ### 2023年7月 版本 2.6 带来了对 AWS CloudHSM 平台的支持,库版本 5.9。 限制如下: - 该平台不支持证书,因此任何处理证书的命令都会失败 - 该平台不支持更改属性值;一些命令依赖该功能来调整对象的 `CKA_ID`。这些命令在执行时偶尔可能会报告错误;密钥材料通常会创建成功。 - 由于同样的原因,`p11mv` 和 `p11setattr` 将无法在此平台上运行。 - 该平台不允许重复的 `CKA_ID` 属性,这在生成密钥材料时偶尔会带来问题。这将在后续版本中调整。 - 由于 CloudHSM 处理属性的方式,`p11od` 命令无法工作。 - 当使用封装密钥文件时,不支持 `CKA_SIGN_RECOVER` 和 `CKA_VERIFY_RECOVER`,应将其注释掉。 - 该平台不支持封装和解封装模板。这些也应在封装密钥文件中注释掉。 AWS CloudHSM 支持默认禁用;有关更多详细信息,请参阅 [安装说明](docs/INSTALL.md)。 ### 2023年6月 版本 2.6 在 `p11keygen`、`p11wrap` 和 `p11rewrap` 命令中引入了对 JWK - JOSE Web Key 输出 (RFC 7517) 的支持。导入密钥时不支持 JWK 格式。 ### 2021年10月 版本 2.5 在许多密钥管理命令上带来了对 `CKA_ALLOWED_MECHANISMS` 的支持:`p11keygen`、`p11wrap`、`p11unwrap`、`p11rewrap`、`p11od`、`p11ls`。请注意,封装密钥语法已更改;语法版本号已增加至 `2.2`。 ### 2021年7月 版本 2.4,在许多命令中支持模板:`p11keygen`、`p11importpubk`、`p11wrap`、`p11unwrap`、`p11od`、`p11ls`。使用模板创建的密钥可以被封装,模板属性将被保留。请注意,封装密钥语法已更改,语法版本号已增加至 `2.1`。 ### 2021年4月 版本 2.3,为 p11kcv 添加了额外选项,以便也支持不支持 NULL 长度 HMAC 计算的令牌。 ### 2021年3月 版本 2.2 略微改变了 `p11slotinfo` 的布局。Edwards Curve 支持得到增强。该工具包也被调整为可打包为 [FreeBSD port](https://www.freshports.org/security/pkcs11-tools/)。 ### 2021年1月 版本 2.1 带来了对 Edwards Curve 的支持。 ### 2020年12月 该工具包已达到 v2.0。它具有几项重大更改: - 它支持(并要求)OpenSSL v1.1.1+ - 签名命令(`p11mkcert`、`p11req` 和 `masqreq`)实现了 OpenSSL 算法方法。这将使得在未来能够支持更多算法。 - 对封装/解封装系统进行了重大改进:现在可以通过单个命令以安全的方式执行双重封装(即信封封装) - `p11keygen` 现在可以生成会话密钥并在一个或多个封装密钥下对其进行封装 - 一个新命令 `p11rewrap` 允许解封装密钥并立即以安全的方式在一个或多个封装密钥下重新封装。 ## 介绍 在继续之前,请确保已安装 [安装文档](https://github.com/Mastercard/pkcs11-tools/blob/master/docs/INSTALL.md) 中列出的前提条件 要构建源代码,只需执行(使用适当的权限) ``` $ ./bootstrap.sh $ ./configure $ make install ``` 要列出 PKCS#11 令牌上可用的方法,请使用 `p11slotinfo`,它将返回可用机制的列表以及允许的 API。 ``` $ using PKCS11LIB at /opt/softhsm2-devel/lib/softhsm/libsofthsm2.so PKCS#11 Library --------------- Name : /opt/softhsm2-devel/lib/softhsm/libsofthsm2.so Lib version : 2.6 API version : 2.40 Description : Implementation of PKCS11 Manufacturer: SoftHSM PKCS#11 module slot list: Slot index: 0 ---------------- Description : SoftHSM slot ID 0x4fbfdc13 Token Label : token1 Manufacturer: SoftHSM project Enter slot index: 0 Slot[0] ------------- Slot Number : 1337973779 Description : SoftHSM slot ID 0x4fbfdc13 Manufacturer: SoftHSM project Slot Flags : [ CKF_TOKEN_PRESENT ] Token ------------- Label : first token Manufacturer: SoftHSM project Token Flags : [ CKF_RNG CKF_LOGIN_REQUIRED CKF_USER_PIN_INITIALIZED CKF_RESTORE_KEY_NOT_NEEDED CKF_TOKEN_INITIALIZED ] Mechanisms: ----------- CKM_MD5 --- --- hsh --- --- --- --- --- --- --- --- --- SW (00000210) CKM_SHA_1 --- --- hsh --- --- --- --- --- --- --- --- --- SW (00000220) CKM_SHA224 --- --- hsh --- --- --- --- --- --- --- --- --- SW (00000255) CKM_SHA256 --- --- hsh --- --- --- --- --- --- --- --- --- SW (00000250) CKM_SHA384 --- --- hsh --- --- --- --- --- --- --- --- --- SW (00000260) CKM_SHA512 --- --- hsh --- --- --- --- --- --- --- --- --- SW (00000270) CKM_MD5_HMAC --- --- --- sig --- vfy --- --- --- --- --- --- SW (00000211) CKM_SHA_1_HMAC --- --- --- sig --- vfy --- --- --- --- --- --- SW (00000221) CKM_SHA224_HMAC --- --- --- sig --- vfy --- --- --- --- --- --- SW (00000256) CKM_SHA256_HMAC --- --- --- sig --- vfy --- --- --- --- --- --- SW (00000251) CKM_SHA384_HMAC --- --- --- sig --- vfy --- --- --- --- --- --- SW (00000261) CKM_SHA512_HMAC --- --- --- sig --- vfy --- --- --- --- --- --- SW (00000271) CKM_RSA_PKCS_KEY_PAIR_GEN --- --- --- --- --- --- --- --- gkp --- --- --- SW (00000000) CKM_RSA_PKCS enc dec --- sig --- vfy --- --- --- wra unw --- SW (00000001) ... ``` 要列出位于索引为 0 的插槽中的令牌上的对象,请使用 `p11ls`。对象及其属性将一同列出; ``` $ p11ls -l /usr/local/opt/softhsm/lib/softhsm/libsofthsm2.so -s 0 Enter passphrase for token: ****** seck/des-double tok,prv,r/w,loc,enc,dec,sen,ase,nxt,des(128) pubk/rsa tok,pub,r/w,loc,vfy,rsa(2048) seck/des-simple tok,prv,r/w,loc,enc,dec,sen,ase,nxt,des(64) seck/aes-wrapping tok,prv,r/w,imp,wra,unw,sen,NAS,WXT,aes pubk/dh tok,pub,r/w,loc,enc,vre,wra,dh(2048) pubk/rsa-wrapping tok,pub,r/w,loc,wra,rsa(2048) prvk/rsa-disclosed tok,prv,r/w,loc,sig,NSE,NAS,XTR,WXT,rsa(2048) prvk/rsa-wrapping tok,prv,r/w,loc,unw,sen,ase,nxt,rsa(2048) seck/aes-128 tok,prv,r/w,loc,enc,dec,sen,ase,nxt,aes(128) seck/aes-256 tok,prv,r/w,loc,wra,unw,sen,ase,nxt,aes(256) prvk/rsa tok,prv,r/w,loc,sig,sen,ase,nxt,rsa(2048) pubk/rsa-disclosed tok,pub,r/w,loc,vfy,rsa(2048) prvk/dh tok,prv,r/w,loc,dec,sir,unw,sen,ase,nxt,dh(2048) seck/des-triple tok,prv,r/w,loc,enc,dec,sen,ase,nxt,des(192) prvk/dsa tok,prv,r/w,loc,dec,sig,sir,unw,sen,ase,nxt,dsa(2048) pubk/dsa tok,pub,r/w,loc,enc,vfy,vre,wra,dsa(2048) data/dsaparam tok,prv, seck/hmac-256 tok,prv,r/w,loc,sig,vfy,sen,ase,nxt,generic data/dhparam tok,prv, ``` 为了避免指定命令行参数,可以为以下项目指定环境变量: |可选参数|描述 |环境变量| |------------|-----------------------------------|--------------------| | `-l` |库的路径 |`PKCS11LIB` | | `-m` |NSS keystore 的路径 (仅限 NSS)|`PKCS11NSSDIR` | | `-s` |插槽索引号 |`PKCS11SLOT` | | `-t` |令牌名称 |`PKCS11TOKEN` | | `-p` |令牌密码 |`PKCS11PASSWORD` | 要提取非敏感对象的值,请使用 `p11cat`: ``` $ p11cat pubk/rsa -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2zd+HKrd1u7TBMfvlpO2 1eT8uoY+aLw6/yT9treLk67czyA6XQ8NMtspacgxLXbC0XbaObGJDOswFN2o+zjA hgKkBY6mEZKO3dzmqtQupQvxybyrj0pg0e+YoZe34rIjVvCdJ9T48etvCyrDZata XYMw9pT2JvlJQG2ddPVjR83tGNayGYWmz5L0JwDLlb0NwJTJItIaabseIKHqQOzN tSgeLsOmy08aqSq87WKEAilXrxcv8mWl/gbu18Chu4z7KJ76dWHnJfXzIMJCNNxf HjhvKZx6bFMEi/gI9gCkUekO+6clrEjSxWzgnC8IDZCLGAvNBZ0pKBW9yEuayPiX rQIDAQAB -----END PUBLIC KEY----- ``` 要查看对象的值,请使用 `p11more`: ``` $ p11more cert/rootca Certificate: Data: Version: 3 (0x2) Serial Number: 2933735351 (0xaedd3fb7) Signature Algorithm: sha256WithRSAEncryption Issuer: C=BE, O=Dummy CA Inc., CN=Dummy Root CA G1 Validity Not Before: Sep 28 08:10:48 2018 GMT Not After : Sep 28 08:10:48 2028 GMT Subject: C=BE, O=Dummy CA Inc., CN=Dummy Root CA G1 Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:a9:a6:a5:99:d0:3e:0e:00:c1:f7:df:9f:9c:92: 40:ac:67:d3:77:e0:d5:6d:eb:a0:5c:29:12:ad:57: a3:23:9a:27:03:cb:dc:62:43:c3:04:a8:e8:a3:ab: ... ``` 此外,`p11od` 可用于从对象中提取所有属性值: ``` $ p11od pubk/dh pubk/dh: CKA_CLASS: 0000 02 00 00 00 00 00 00 00 CKO_PUBLIC_KEY CKA_TOKEN: 0000 01 CK_TRUE CKA_PRIVATE: 0000 00 CK_FALSE CKA_LABEL: 0000 64 68 dh CKA_VALUE: 0000 7e cc a1 d2 c2 e7 90 b9 fa 68 fc ae 49 46 2e 0f ~........h..IF.. 0010 62 1e 2c 69 2e 94 f2 eb 46 63 d7 fd 57 1f 5d 02 b.,i....Fc..W.]. 0020 30 f4 3b 48 44 0c eb d7 7e 83 d5 26 7c 7a a3 f5 0.;HD...~..&|z.. ... ``` 生成密钥很容易:只需使用带有适当参数的 `p11keygen`。 ``` $ p11keygen -k ec -q prime256v1 -i my-ec-key sign=true verify=true Generating, please wait... key generation succeeded ``` 同样,`p11req` 用于生成 CSR。 ``` $ p11req -i my-ec-key -d '/CN=my.site.org/O=My organization/C=BE' -e 'DNS:another-url-for-my.site.org' -v Certificate Request: Data: Version: 0 (0x0) Subject: C=BE, O=My organization, CN=my.site.org Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:3f:56:11:f8:38:c7:f0:c1:87:a4:75:1a:ca:2e: 46:38:9e:6a:79:3a:3e:a5:90:54:48:be:81:18:c6: f3:1c:92:8b:72:35:cd:e3:32:8c:40:a4:d4:e7:33: 50:13:34:4a:87:e0:8c:17:77:39:ed:ef:de:d3:1a: 26:b3:11:87:13 ASN1 OID: prime256v1 NIST CURVE: P-256 Attributes: Requested Extensions: X509v3 Subject Alternative Name: DNS:another-url-for-my.site.org Signature Algorithm: ecdsa-with-SHA256 30:45:02:21:00:e8:b7:c0:49:bc:77:8d:94:29:18:66:8f:9d: 6a:62:cd:f0:84:46:89:73:93:11:d8:67:98:95:12:1c:53:f7: 5f:02:20:4a:b6:98:fd:66:be:7c:7f:d1:02:07:d0:5b:dc:8b: fd:3f:89:f0:ed:03:ec:2e:a4:1c:72:a2:21:22:9f:a5:7d -----BEGIN CERTIFICATE REQUEST----- MIIBMTCB2AIBADA9MQswCQYDVQQGEwJCRTEYMBYGA1UECgwPTXkgb3JnYW5pemF0 aW9uMRQwEgYDVQQDDAtteS5zaXRlLm9yZzBZMBMGByqGSM49AgEGCCqGSM49AwEH A0IABD9WEfg4x/DBh6R1GsouRjieank6PqWQVEi+gRjG8xySi3I1zeMyjECk1Ocz UBM0SofgjBd3Oe3v3tMaJrMRhxOgOTA3BgkqhkiG9w0BCQ4xKjAoMCYGA1UdEQQf MB2CG2Fub3RoZXItdXJsLWZvci1teS5zaXRlLm9yZzAKBggqhkjOPQQDAgNIADBF AiEA6LfASbx3jZQpGGaPnWpizfCERolzkxHYZ5iVEhxT918CIEq2mP1mvnx/0QIH 0Fvci/0/ifDtA+wupBxyoiEin6V9 -----END CERTIFICATE REQUEST----- ``` 稍后,可以使用 `p11importcert` 将证书导回 keystore。可以使用 `p11importpubk` 导入公钥,使用 `p11importdata` 导入数据文件。 如果需要封装或解封装密钥,可以使用命令 `p11wrap`: ``` $ p11wrap -w aes-wrapping -i rootca -a cbcpad >wrapped-key.wrap key wrapping succeeded ``` 密钥稍后可以被解封装,重用之前创建的 `wrapped-key.wrap` 文件: ``` $ p11unwrap -f wrapped-key.wrap key unwrapping succeeded ``` ## 安装 该项目可以在许多平台上编译,包括 Linux、AIX、Solaris。使用交叉编译器,也可以为 Windows 平台编译。在 macOS 下编译需要 [brew](https://brew.sh/)。请参阅 [docs/INSTALL.md](docs/INSTALL.md) 获取安装说明。 ## 手册 请参阅 [docs/MANUAL.md](docs/MANUAL.md) 获取说明/操作指南。 ## 贡献 如果您希望为此项目做出贡献,请参阅 [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md) 中的规则。 贡献者: - Georg Lippold (Mastercard, https://www.mastercard.com) - JWK 输出, GitHub build & CodeQL 集成 ## 作者 Eric Devolder (Mastercard, https://www.mastercard.com) ## 许可条款 除非在源文件中另有说明,否则适用以下许可: 版权所有 (c) 2018 Mastercard 根据 Apache 许可证 2.0 版(“许可证”)获得许可;除非遵守许可证,否则您不得使用此文件。您可以在以下位置获取许可证副本 http://www.apache.org/licenses/LICENSE-2.0 除非适用法律要求或书面同意,否则根据许可证分发的软件是按“原样”分发的,没有任何形式的明示或暗示的保证或条件。请参阅许可证以了解许可证下的特定语言管理权限和限制。
标签:AES, CloudHSM, CSR生成, ECC, Edwards曲线, HSM, IBM JVM, meg, NSS, Oracle JVM, PKCS#11, RSA, SamuraiWTF, 令牌管理, 信息安全, 加解密, 安全测试工具, 客户端加密, 密码学, 密钥包装, 手动系统调用, 数字证书