wolfSSL/wolfCLU

GitHub: wolfSSL/wolfCLU

wolfCLU 是基于 wolfSSL 的命令行密码学工具,提供密钥生成、证书签发、签名验证和 OCSP 响应等完整的 PKI 管理能力。

Stars: 25 | Forks: 44

# wolfCLU 这是 wolfSSL 命令行实用工具 (wolfCLU)。 ## 前置条件 要构建 wolfSSL 和 wolfCLU,你需要安装 autoconf、automake 和 libtool。 ## wolfSSL 安装 使用以下命令配置并安装 wolfSSL: ``` ./autogen.sh # only needed if source pulled from GitHub ./configure --enable-wolfclu make make check sudo make install ``` ## wolfCLU 安装 安装 wolfSSL 后,从 wolfCLU 根目录安装 wolfCLU: ``` ./autogen.sh # only needed if source pulled from GitHub ./configure make make check sudo make install ``` 如果最近刚安装过 wolfSSL,请运行 `sudo ldconfig` 以更新链接器缓存。 #### 构建选项 你可以使用 configure 标志来定制构建: ``` ./configure --disable-manpages # Skip manpage installation (useful for embedded builds) ./configure --with-wolfssl=PATH # Specify wolfSSL installation path ``` 现在,你应该可以使用了 wolfCLU 了: ``` wolfssl -h ``` 如果一切正常,你应该会看到 wolfCLU 的帮助信息。手册页也会在 `make install` 期间自动安装,因此你可以立即查看它们: ``` man wolfssl man wolfssl-genkey man wolfssl-encrypt ``` 有关如何构建 Windows 版本的说明,请参见[这里](ide/winvs/README.md)。 ### 手册页构建 手册页会在正常构建过程中自动生成并安装(除非使用 `--disable-manpages` 禁用)。当你运行 `make install` 时,`manpages/` 目录中的 `.1` 源文件会被安装到你配置的 man1 目录中(通常是 `/usr/local/share/man/man1` 或 `/usr/share/man/man1`),从而可以通过 `man` 命令访问它们。 对于积极编辑手册页文件(`manpages/` 目录中的 `.1` 文件)的开发者,你可以在不运行完整构建的情况下本地测试更改: ``` mkdir -p ~/.local/share/man/man1 cp manpages/*.1 ~/.local/share/man/man1/ man wolfssl-base64 ``` 或者,生成压缩版本并直接查看(仅在启用了手册页时可用): ``` make manpages-gz man -l manpages/wolfssl-base64.1.gz # GNU man; on macOS/BSD use man manpages/wolfssl-base64.1 ``` **重要提示:** 仅将 `.1` 源文件提交到代码库。`.1.gz` 压缩版本是在构建和分发期间按需生成的——它们已被 gitignore 忽略,永远不应该在 git 中被跟踪。 ## 示例 ### 密钥生成 以下命令以 PEM 格式生成一对 RSA 公钥/私钥。 ``` wolfssl genkey rsa -size 2048 -out mykey -outform pem -output KEY ``` 生成的文件 mykey.priv 和 mykey.pub 如下所示。 ``` -----BEGIN RSA PRIVATE KEY----- MIIEogIBAAKCAQEAvCjQxgLC0QT3m2KCBRGF9inN3xKzTd9Aht2i3on5th1gFTmh 0X9M8MFoOnXrzAuTTq/rjR1OLJCBJkB029zoXkbGMN/D0KCXRNl1SRTH+Z5lL6ZG 88ckhMYoAk96FDZq83WCEL/UnAkL/U1IRSHmCzmQdYSMkO4+7upvipEjwe3yP1DN w/Dx72fMRKagkbjAujETzVRn17kEe4uENBOX/hFPjjVf+7ie+AgY6UAxWaDt46IC Y0c/PisP+aSj5+yLDGHcGOrgRIt4lJ8NQXvmQtyH6lfLomOobGJMbrAmy68fmCzR y8lfaxS05SnsUIHulotxZgZ0ZFhPB7q8EAsRKQIDAQABAoIBAG8KV0rDzlyz5bwZ gkmjcb84JHqE+rP2EIqGudtC6c8DvvRHsquDyNA8E1qMxL8CBcjmIMiChuPd05nT aCNoVulsMwIcy96PJzZGbuTWEr3JMEXShwTOfUqt9maGqLDM/Ij4y+0+iCYdYKn3 tbK2sp/lNM9ljd7p+tHcID9SMBv9YIP3XwEPHxPDXcHEah5G9eNTOYpZvNCZf0pO ShKTDfRi/DYm6gOYMca9hiJANoG7LfkcXRDpmPYC6wzJZSN0SBNn27I9A9JkwoPQ /vLi9782TyNM/ncurFIiRi7vJho398WPNf0lOI+8kjvH9OPI87usYNjLAo3CXZS+ bow7kFECgYEA7tn2yrZHfoA526mWRkkf7I9B+c/7YA++8hyt2XiDPIGMsa78yae1 MBn9SgF/bAdYq/aazGMPKtENIF2vHEfEH9W5Kqgp9qW/emqvU9Rj6CDyznhXcwN8 uGIPow+uSN5bPysmFp/wjg8AM9SryRaVWgkykaLvhALcTVjH8Lwv8psCgYEAyask 4XO22NieX/v6v6uVwaVGH6Uo5uHNbu7p0SuvEQMXWEIQKB3vHdtR3XE6sH+E6rX3 5KgxqPzbodLXd2PV15VWwTTb+/jrJkWN9Ix0nbez4eP7MrSUJjtrXKk8+1VQKCPn wbwsw1jsAj2DuDyqXbcnEY5t1rhY5z1JCE+89YsCgYA3Xw5IdjNizyUamFj/GEqv U5Ku8BlNbrkMdbuT081QxJOySWfO8/McIJpIgspgZ9+VlgjS4xAMFASgATfsLXL5 Elnn2q5HwKsAHSViILW8hY7kcJ+NSTyrnggT/DmiKPIsVbtxuUhSFoYsfdwJNRQQ mFtBye0OxH7/61oGpAnViwKBgF5lMXomA6w0mM0s0Q3ubsaZad1eHWsUvmfyhJdX 7zXzUHYLViyw9j/vbL5ORb5fsgN68XGiGLyUvulcG2bS4EFssZL1/xJOTSM4411Y cS1x000kvWvago3yuipBPT4XjNF9HPnd7sXxVWcnDASswMHk/PCGznr3BwYV9Z1i VXxJAoGAN6ZLY3Ol+CxSICNe5RZM7ZTs9GadgN7jSYqFUpZQX6nMZxaftNdhVIum K9jchl6IVIZVOyNE0yX02oj1tUUruhC3pdSg8NQSVoYonNFvJwKzBOgVqJKsNjrF I+sL/vVEOzji/VePapveVG5yGDiAT1FKg6MDHJ8U+H5j+Go3bmI= -----END RSA PRIVATE KEY----- ``` ``` -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvCjQxgLC0QT3m2KCBRGF 9inN3xKzTd9Aht2i3on5th1gFTmh0X9M8MFoOnXrzAuTTq/rjR1OLJCBJkB029zo XkbGMN/D0KCXRNl1SRTH+Z5lL6ZG88ckhMYoAk96FDZq83WCEL/UnAkL/U1IRSHm CzmQdYSMkO4+7upvipEjwe3yP1DNw/Dx72fMRKagkbjAujETzVRn17kEe4uENBOX /hFPjjVf+7ie+AgY6UAxWaDt46ICY0c/PisP+aSj5+yLDGHcGOrgRIt4lJ8NQXvm QtyH6lfLomOobGJMbrAmy68fmCzRy8lfaxS05SnsUIHulotxZgZ0ZFhPB7q8EAsR KQIDAQAB -----END PUBLIC KEY----- ``` ### 证书生成 此命令使用上面创建的私钥生成 X509 证书。 ``` wolfssl req -new -days 3650 -key mykey.priv -out test.cert -x509 ``` 生成的文件 test.cert 如下所示。 ``` -----BEGIN CERTIFICATE----- MIICiDCCAXCgAwIBAgIQUxgFCkVR/08kI3nA38BsLTANBgkqhkiG9w0BAQsFADAA MB4XDTIyMDIxODIwMzUwMFoXDTMyMDIxNjIwMzUwMFowADCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBALwo0MYCwtEE95tiggURhfYpzd8Ss03fQIbdot6J +bYdYBU5odF/TPDBaDp168wLk06v640dTiyQgSZAdNvc6F5GxjDfw9Cgl0TZdUkU x/meZS+mRvPHJITGKAJPehQ2avN1ghC/1JwJC/1NSEUh5gs5kHWEjJDuPu7qb4qR I8Ht8j9QzcPw8e9nzESmoJG4wLoxE81UZ9e5BHuLhDQTl/4RT441X/u4nvgIGOlA MVmg7eOiAmNHPz4rD/mko+fsiwxh3Bjq4ESLeJSfDUF75kLch+pXy6JjqGxiTG6w JsuvH5gs0cvJX2sUtOUp7FCB7paLcWYGdGRYTwe6vBALESkCAwEAATANBgkqhkiG 9w0BAQsFAAOCAQEAHHX+4PTg1nv8Bo0LgLqmx0YtG08Ye8IvPLRNIePSYRdVwToW MRPOvUU2/VQ41ro+iqlvopb2wX+gNz2K89EU3PQ6tVXxj0JiVB7DpXm/8lMklf3v 0DGAJrvK3dEPbTvb71JG5qkwcBaS8jARKXOkuyW2D9yVSVKT/CkylpanRfXuU4NL adaA+l398KpM0c0XT7Fl4ylSeZLLi5CSObu1kkPpYqjAGyI+y0EW79btz88U2QmB uqGDApXWYuBdjheL4Ysoq6YXtt6dnm8DkBVrnt+gAMCBFbBNPXxy2MODBDqya907 iky6IRTUzkBy1fssv3Gr/jOsyN8J565NST3RpQ== -----END CERTIFICATE----- ``` ### DGST 签名与验证 以下命令对此 README 进行签名,然后使用生成的签名进行验证。 ``` wolfssl dgst -sha256 -sign mykey.priv -out readme.sig ./README.md wolfssl dgst -sha256 -verify mykey.pub -signature readme.sig ./README.md ``` ### 创建证书颁发机构 (CA) 以使用 ECC 签名/验证来签署其他证书 以下演示了如何创建根 CA 并使用它来签署其他证书。此示例使用 ECC,但 RSA 的步骤类似。 在此场景中,有三个实体 A、B 和 C,其中 A 作为根 CA。 以下步骤演示了如何为 A、B 和 C 生成密钥和证书,其中 A 是自签名的,而 B 和 C 由 A 签名。 1. 为 A、B 和 C 创建私有 ECC 密钥(如果要改为创建 RSA 密钥,请使用 `wolfssl -genkey rsa`) ``` wolfssl -genkey ecc -out ecc-key-A -output priv -outform PEM wolfssl -genkey ecc -out ecc-key-B -output priv -outform PEM wolfssl -genkey ecc -out ecc-key-C -output priv -outform PEM ``` 2. 为 A 创建一个自签名证书,它将作为我们的 CA ``` wolfssl req -new -key ecc-key-A.priv -subj O=org-A/C=US/ST=WA/L=Seattle/CN=A/OU=org-unit-A -x509 -out A.cert -outform PEM ``` 3. 创建由 A 签名的 B 和 C 的证书 ``` # 首先为 B 和 C 创建 certificate signing request (CSR) wolfssl req -new -key ecc-key-B.priv -subj O=org-B/C=US/ST=WA/L=Seattle/CN=B/OU=org-unit-B -out B.csr -outform PEM wolfssl req -new -key ecc-key-C.priv -subj O=org-C/C=US/ST=WA/L=Seattle/CN=C/OU=org-unit-C -out C.csr -outform PEM # 现在让我们的 CA (A) 签署 B 和 C 的 CSR 以生成它们的证书 wolfssl ca -in B.csr -keyfile ecc-key-A.priv -cert A.cert -out B.cert wolfssl ca -in C.csr -keyfile ecc-key-A.priv -cert A.cert -out C.cert ``` 我们现在可以使用以下命令,通过我们的 CA 证书 A 来验证证书 B 和 C: ``` wolfssl verify -CAfile A.cert B.cert wolfssl verify -CAfile A.cert C.cert ``` ### 创建 Chimera 证书 以下是创建用于 PQC(后量子密码学)的 Chimera(双重算法)证书的场景。 以下演示了如何创建根 CA 并使用它来签署其他证书。此示例使用 ECC 和 ML-DSA。在此场景中,有三个实体 A、B 和 C,其中 A 作为根 CA,并假定 B 是中间 CA。 在运行以下命令之前,请确保在 wolfSSL 中启用了 `ml-dsa` 选项。这可以通过在配置 wolfSSL 时使用 `--enable-wolfclu`、`--enable-dilithium`、`--enable-dual-alg-certs` 和 `--enable-experimental` 来实现。 以下步骤演示了如何为 A、B 和 C 生成密钥和证书,其中 A 是自签名的,而 B 和 C 由 A 签名。 1. 为 A、B 和 C 创建私有 ECC 和 ML-DSA 密钥 ``` wolfssl genkey ecc -name secp521r1 -out ecc-key-A -output priv -outform PEM wolfssl genkey ecc -name secp384r1 -out ecc-key-B -output priv -outform PEM wolfssl genkey ecc -name secp256r1 -out ecc-key-C -output priv -outform PEM wolfssl genkey ml-dsa -level 5 -out ml-dsa-key-A -output keypair -outform PEM wolfssl genkey ml-dsa -level 3 -out ml-dsa-key-B -output keypair -outform PEM wolfssl genkey ml-dsa -level 2 -out ml-dsa-key-C -output keypair -outform PEM ``` 2. 为 A 创建自签名的常规证书,即根 CA 证书。 ``` wolfssl req -new -key ecc-key-A.priv -subj O=org-A/C=US/ST=WA/L=Seattle/CN=A/OU=org-unit-A -x509 -out A.cert -outform PEM wolfssl ca -altextend -in A.cert -keyfile ecc-key-A.priv -altkey ml-dsa-key-A.priv -altpub ml-dsa-key-A.pub -out A-chimera.cert ``` 3. 为 B 和 C 创建证书。 ``` # 首先为 B 和 C 创建常规的 certificate signing request (CSR) wolfssl req -new -key ecc-key-B.priv -subj O=org-B/C=US/ST=WA/L=Seattle/CN=B/OU=org-unit-B -out B.csr -outform PEM wolfssl req -new -key ecc-key-C.priv -subj O=org-C/C=US/ST=WA/L=Seattle/CN=C/OU=org-unit-C -out C.csr -outform PEM # 现在有了常规的签名证书,然后添加一个 pub key 并且 Chimera 签署 B 和 C 以生成 Chimera 证书 wolfssl ca -in B.csr -keyfile ecc-key-A.priv -cert A.cert -out B.cert wolfssl ca -in C.csr -keyfile ecc-key-B.priv -cert B.cert -out C.cert wolfssl ca -altextend -in B.cert -keyfile ecc-key-A.priv -altkey ml-dsa-key-A.priv -altpub ml-dsa-key-B.pub -subjkey ecc-key-B.priv -cert A-chimera.cert -out B-chimera.cert wolfssl ca -altextend -in C.cert -keyfile ecc-key-B.priv -altkey ml-dsa-key-B.priv -altpub ml-dsa-key-C.pub -subjkey ecc-key-C.priv -cert B-chimera.cert -out C-chimera.cert ``` ## 使用 nginx 和 SCGI 部署 OCSP 响应器 wolfCLU 包含一个 OCSP 响应器,可以使用 nginx 作为 HTTP 前端,并使用 SCGI(简单通用网关接口)作为通信协议将其部署到生产环境中。**这是首选的部署方法**,因为 SCGI 比 HTTP 简单得多,同时允许你利用像 nginx 这样成熟且强大的 HTTP 实现。 ### 为什么选择 SCGI? - **简单性**:SCGI 是一种简单的协议,比完整的 HTTP 更容易实现 - **稳健性**:nginx 处理所有 HTTP 相关的问题(超时、keep-alive、TLS、负载均衡等) - **角色分离**:OCSP 响应器专注于 OCSP 逻辑,nginx 负责处理 Web 服务 ### 前置条件 安装 nginx: ``` sudo apt-get install nginx # Debian/Ubuntu sudo yum install nginx # RHEL/CentOS brew install nginx # macOS ``` ### 基本设置 1. **以 SCGI 模式启动 wolfCLU OCSP 响应器:** ``` wolfssl ocsp -scgi \ -port 8081 \ -index /path/to/index.txt \ -rsigner /path/to/ca-cert.pem \ -rkey /path/to/ca-key.pem \ -CA /path/to/ca-cert.pem ``` 响应器将在 8081 端口监听 SCGI 连接。 2. **配置 nginx 将 HTTP OCSP 请求代理到 SCGI 后端:** 创建文件 `/etc/nginx/ocsp-scgi.conf`: ``` # 用于 OCSP 的 SCGI 参数 scgi_param REQUEST_METHOD $request_method; scgi_param REQUEST_URI $request_uri; scgi_param QUERY_STRING $query_string; scgi_param CONTENT_TYPE $content_type; scgi_param CONTENT_LENGTH $content_length; scgi_param SCRIPT_NAME $fastcgi_script_name; scgi_param DOCUMENT_URI $document_uri; scgi_param DOCUMENT_ROOT $document_root; scgi_param SERVER_PROTOCOL $server_protocol; scgi_param HTTPS $https if_not_empty; scgi_param REMOTE_ADDR $remote_addr; scgi_param REMOTE_PORT $remote_port; scgi_param SERVER_PORT $server_port; scgi_param SERVER_NAME $server_name; ``` 添加到你的 nginx 站点配置中(例如,`/etc/nginx/sites-available/default`): ``` server { listen 80; server_name ocsp.example.com; location /ocsp { scgi_pass localhost:8081; include /etc/nginx/ocsp-scgi.conf; scgi_connect_timeout 5s; scgi_send_timeout 10s; scgi_read_timeout 10s; } } ``` 3. **重新加载 nginx:** ``` sudo nginx -t # Test configuration sudo systemctl reload nginx # Reload nginx ``` 4. **测试 OCSP 响应器:** ``` wolfssl ocsp \ -issuer ca-cert.pem \ -cert server-cert.pem \ -url http://ocsp.example.com/ocsp ``` ### 索引文件格式 `-index` 文件使用 OpenSSL 的 CA 索引格式。 ## 联系方式 如有任何问题或意见,请联系 support@wolfssl.com。 ## 许可证 版权所有 (c) 2006-2025 wolfSSL Inc.
标签:C/C++, SOC Prime, 事务性I/O, 加密库, 安全组件, 客户端加密, 密码学, 开发工具, 手动系统调用