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, 加密库, 安全组件, 客户端加密, 密码学, 开发工具, 手动系统调用