vegardit/docker-softhsm2-pkcs11-proxy

GitHub: vegardit/docker-softhsm2-pkcs11-proxy

基于 SoftHSM2 和 pkcs11-proxy 的 Docker 镜像,提供可通过网络远程访问的虚拟 HSM 服务,用于开发测试环境中的密钥管理和密码学操作。

Stars: 43 | Forks: 10

# vegardit/docker-softhsm2-pkcs11-proxy [![构建状态](https://github.com/vegardit/docker-softhsm2-pkcs11-proxy/workflows/Build/badge.svg "GitHub Actions")](https://github.com/vegardit/docker-softhsm2-pkcs11-proxy/actions?query=workflow%3ABuild) [![许可证](https://img.shields.io/github/license/vegardit/docker-softhsm2-pkcs11-proxy.svg?label=license)](#license) [![Docker 拉取次数](https://img.shields.io/docker/pulls/vegardit/softhsm2-pkcs11-proxy.svg)](https://hub.docker.com/r/vegardit/softhsm2-pkcs11-proxy) [![Docker 星标数](https://img.shields.io/docker/stars/vegardit/softhsm2-pkcs11-proxy.svg)](https://hub.docker.com/r/vegardit/softhsm2-pkcs11-proxy) [![贡献者公约](https://img.shields.io/badge/Contributor%20Covenant-v2.1%20adopted-ff69b4.svg)](CODE_OF_CONDUCT.md) 1. [它是什么?](#what-is-it) 2. [Docker 镜像标签方案](#tags) 3. [使用方法](#usage) 4. [许可证](#license) ## 它是什么? 一个多架构 Docker 镜像,用于运行基于 [SoftHSM2](https://github.com/softhsm/SoftHSMv2) 和 [pkcs11-proxy](https://github.com/smallstep/pkcs11-proxy) 的虚拟 HSM(硬件安全模块)网络服务。 **每周**自动重建以包含最新的操作系统安全修复。 客户端应用程序可以使用 libpkcs11-proxy.so 和 OpenSSL TLS-PSK 通过 TCP/TLS 与 HSM 通信: ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/25b0927f8c093245.png) ## Docker 镜像标签方案 |标签|描述|基础镜像 |-|-|- |`:latest`
`:latest-alpine` | 最新可用 SoftHSM 版本的每周构建 | alpine:3 |`:latest-debian` | 最新可用 SoftHSM 版本的每周构建 | debian:stable-slim |`:develop`
`:develop-alpine` | 开发分支的每周构建 | alpine:3 |`:develop-debian` | 开发分支的每周构建 | debian:stable-slim |`:2.x`
`:2.x-alpine` | 各自主要版本(如 `2.x` 可能包含版本 `2.6`)的最新次要版本的每周构建 | alpine:3 |`:2.x-debian` | 各自主要版本(如 `2.x` 可能包含版本 `2.6`)的最新次要版本的每周构建 | debian:stable-slim 查看所有标签:https://hub.docker.com/r/vegardit/softhsm2-pkcs11-proxy/tags ## 使用方法 ### 服务配置 SoftHSMv2 的内部存储位于 `/var/lib/softhsm/`。 PKCS11 Daemon 默认监听端口 `2345`。 Docker 镜像可以通过以下环境变量进行配置: |名称 | 说明 | 默认值 |- |- |- |INIT_SH_FILE | 容器启动时应自动执行的文件的路径。 | [`/opt/init-token.sh`](image/init-token.sh) |TOKEN_AUTO_CREATE | 如果令牌尚不存在,是否在容器启动时根据以下值创建它:`0` = 否 或 `1` = 是 | `1` |TOKEN_LABEL | 要自动创建的令牌的名称。 |`Test Token` |TOKEN_USER_PIN | 要自动创建的令牌的用户 PIN。 |`1234` |TOKEN_USER_PIN_FILE | 包含用户 PIN 的文件路径。此文件中的值优先于 TOKEN_USER_PIN 变量。 | 空 |TOKEN_SO_PIN | 要自动创建的令牌的 SO(安全主管/管理员用户)PIN。 |`5678` |TOKEN_SO_PIN_FILE | 包含 SO PIN 的文件路径。文件中的值优先于 TOKEN_SO_PIN 变量。 | 空 |TOKEN_IMPORT_TEST_DATA | 指定是否导入测试证书:`0` = 否 或 `1` = 是 | `0` |PKCS11_DAEMON_SOCKET | PKCS11 daemon 监听的套接字。 |`tls://0.0.0.0:2345` |PKCS11_PROXY_TLS_PSK_FILE | 包含 PKCS11 daemon 的 OpenSSL TLS-PSK(预共享密钥)的文件。 |`/opt/test.tls.psk` |SOFTHSM_STORAGE | 指定使用哪个后端来存储令牌:`file` 或 `db` (即 `sqlite`) | `file` 示例: 1. 使用默认测试配置运行: docker run -it -name softhsm vegardit/docker-softhsm2-pkcs11-proxy 2. 使用自定义设置运行: docker run -it --rm \ -name softhsm-server \ # 定义自定义令牌名称: -e TOKEN_LABEL="MyToken" \ # 使用存储在文件中的自定义 PIN: -e TOKEN_USER_PIN_FILE="/mnt/config/token_user_pin" \ -e TOKEN_SO_PIN_FILE="/mnt/config/token_so_pin" \ # 使用自定义 TLS 预共享密钥: -e PKCS11_PROXY_TLS_PSK_FILE="/mnt/config/pkcs11_proxy.psk" \ # 暴露端口 2345 -p 2345:2345 \ # 挂载配置和数据目录: -v /path/to/config:/mnt/config:ro \ -v /path/to/data:/var/lib/softhsm:rw \ vegardit/docker-softhsm2-pkcs11-proxy:latest 3. 同上 docker-compose 文件: version: '3.8' services: softhsm-server: image: vegardit/softhsm2-pkcs11-proxy:latest environment: TOKEN_LABEL: MyToken # 定义自定义令牌名称 TOKEN_USER_PIN_FILE: /mnt/config/token_user_pin # 使用存储在文件中的自定义 PIN TOKEN_SO_PIN_FILE: /mnt/config/token_so_pin # 使用存储在文件中的自定义 PIN TOKEN_IMPORT_TEST_DATA: 0 # 不导入测试数据 PKCS11_PROXY_TLS_PSK_FILE: /mnt/config/pkcs11_proxy.psk # 使用自定义 TLS 预共享密钥 ports: - 2345:2345 volume: /path/to/config:/mnt/config:ro # 以只读方式挂载配置目录 /path/to/data:/var/lib/softhsm:rw # 以读写方式挂载数据目录 deploy: restart_policy: condition: on-failure delay: 5s ### 客户端使用示例 这是一个简单的练习,旨在让您熟悉客户端容器如何通过 PKCS11 proxy 与 SoftHSM 进行远程交互 1. 下载示例 dockerfiles 之一 [client.alpine.Dockerfile](client.alpine.Dockerfile) 或 [client.debian.Dockerfile](client.debian.Dockerfile)。 2. 使用以下命令构建镜像: $ docker build -f /path/to/Dockerfile --tag softhsm-client . 3. 启动 docker 镜像: # 创建一个 docker 网络,两个容器可以通过该网络通信 $ docker network create softhsm-net # 以测试模式启动 SoftHSM 服务器: $ docker run -it --rm \ --net softhsm-net \ --hostname softhsm-server \ vegardit/softhsm2-pkcs11-proxy:latest # 在第二个终端窗口中启动客户端: $ docker run -it --rm \ --net softhsm-net \ -e PKCS11_PROXY_SOCKET=tls://softhsm-server:2345 \ -e PKCS11_PROXY_TLS_PSK_FILE=/opt/test.tls.psk \ softhsm-client 4. 测试网络通信 在客户端容器的 shell 中,您现在可以使用 [pkcs11-tool](https://linux.die.net/man/1/pkcs11-tool) 测试与服务器的连接性。 # # 首先定义一个加载所需代理模块的别名 # $ alias p11tool='pkcs11-tool --module /usr/local/lib/libpkcs11-proxy.so' # # 显示所有插槽 # $ p11tool --list-slots # 输出: Available slots: Slot 0 (0x3e2d07e4): SoftHSM slot ID 0x3e2d07e4 token label : Test Token token manufacturer : SoftHSM project token model : SoftHSM v2 token flags : login required, rng, token initialized, PIN initialized, other flags=0x20 hardware version : 2.6 firmware version : 2.6 serial num : a96de792be2d07e4 pin min/max : 4/255 Slot 1 (0x1): SoftHSM slot ID 0x1 token state: uninitialized # # 生成并存储一个新的密钥对 # $ p11tool --keypairgen --key-type RSA:2048 --label "My Key" --token-label "Test Token" --login --pin 1234 # 输出: Key pair generated: Private Key Object; RSA label: My Key ID: 01 Usage: decrypt, sign, unwrap Public Key Object; RSA 2048 bits label: My Key ID: 01 Usage: encrypt, verify, wrap # # 显示令牌 "Test Token" 中的所有公开对象 # $ p11tool --list-objects --token-label "Test Token" # 输出: Public Key Object; RSA 2048 bits label: My Key ID: 01 Usage: encrypt, verify, wrap # # 显示令牌 "Test Token" 中的所有对象 # $ p11tool --list-objects --token-label "Test Token" --login --pin 1234 # 输出: Private Key Object; RSA label: My Key ID: 01 Usage: decrypt, sign, unwrap Public Key Object; RSA 2048 bits label: My Key ID: 01 Usage: encrypt, verify, wrap ################################# # 使用新密钥签名一些数据 ################################# # # 1. 创建一个要签名的文件 $ echo "Hello World!" > message.txt # 2. 列出可用于签名数据的算法 $ p11tool --list-mechanisms | grep -P "RSA.*sign" # 输出: Using slot 0 with a present token (0x5bb016b2) MD5-RSA-PKCS, keySize={512,16384}, sign, verify RSA-PKCS, keySize={512,16384}, encrypt, decrypt, sign, verify, wrap, unwrap RSA-PKCS-PSS, keySize={512,16384}, sign, verify RSA-X-509, keySize={512,16384}, encrypt, decrypt, sign, verify SHA1-RSA-PKCS, keySize={512,16384}, sign, verify SHA256-RSA-PKCS, keySize={512,16384}, sign, verify SHA384-RSA-PKCS, keySize={512,16384}, sign, verify SHA512-RSA-PKCS, keySize={512,16384}, sign, verify # 3. 使用新创建的密钥签名数据 $ p11tool --sign --id 1 --mechanism SHA256-RSA-PKCS \ --token-label "Test Token" --pin 1234 \ --input-file message.txt \ --output-file message.txt.sig # 输出: Using signature algorithm SHA256-RSA-PKCS ################################# # 验证消息签名 ################################# # 1. 提取公钥 $ p11tool --read-object --type pubkey --label "My Key" --token-label "Test Token" > mykey.pub.der # 2. 将公钥转换为 PEM 格式 $ openssl rsa -inform DER -outform PEM -in mykey.pub.der -pubin > mykey.pub.pem # 输出: writing RSA key # 3. 验证签名 $ openssl dgst -keyform PEM -verify mykey.pub.pem -sha256 -signature message.txt.sig message.txt # 输出: Verified OK ## 资源 - SoftHSM: - 网站:https://www.softhsm.org/ - 源码:https://github.com/softhsm/SoftHSMv2 - 教程: - [SoftHSM2 创建插槽的入门步骤](https://verschlüsselt.it/softhsm2-first-steps/) - pkcs11-proxy: - 源码:https://github.com/scobiej/pkcs11-proxy/tree/osx-openssl1-1 (SUNET/pkcs11-proxy 加上 OpenSSL 1.1 支持) -源码:https://github.com/SUNET/pkcs11-proxy (包含最多更改的分支) - 源码:https://github.com/kedros-as/pkcs11-proxy (最近更新的分支) - 源码:https://github.com/iksaif/pkcs11-proxy (原始版本) - pkcs11-tool: - 源码:https://github.com/Mastercard/pkcs11-tools - 文档:https://linux.die.net/man/1/pkcs11-tool - 教程: - [使用 OpenSC pkcs11-tool 显示插槽和令牌信息](https://verschlüsselt.it/show-slot-and-token-info-with-pkcs11-tool/) - [使用 OpenSC pkcs11-tool 生成 RSA、ECC 和 AES 密钥](https://verschlüsselt.it/generate-rsa-ecc-and-aes-keys-with-opensc-pkcs11-tool/) - [使用 OpenSC pkcs11-tool 导出 RSA / ECC 公钥](https://verschlüsselt.it/export-a-rsa-ecc-public-key-with-opensc-pkcs11-tool/) - [在 SmartCard-HSM 上使用 ECC 和 OpenSC](https://www.smartcard-hsm.com/2014/08/22/using-smartcard-hsm-with-ecc-and-opensc.html) - [OpenSC 测试:使用 OpenSSL CLI 从命令行进行签名、验证、加密和解密](https://gist.github.com/Jakuje/5a993d2b2d8a9cac35203599e49e6831) ## 许可证 本仓库中的所有文件均在 [Apache License 2.0](LICENSE.txt) 下发布。 个别文件包含以下标签来代替完整的许可证文本: ``` SPDX-License-Identifier: Apache-2.0 ``` 这允许基于 SPDX 许可证标识符(可在此处获取:https://spdx.org/licenses/)对许可证信息进行机器处理。
标签:Alpine, Debian, Docker, Hakrawler, HSM, meg, NIDS, OpenSSL, PKCS#11, pkcs11-proxy, SamuraiWTF, SoftHSM2, TLS, 信息安全, 加密技术, 安全测试工具, 安全防御评估, 容器化, 密码学, 开发测试工具, 手动系统调用, 硬件安全模块, 网络服务, 虚拟化, 请求拦截, 远程访问, 防御工具