Ubuntu 20.4下OpenSSL 1.1.1自定义引擎:实现命令行摘要签名的方法及可行性咨询
实现自定义OpenSSL引擎支持
openssl dgst命令行签名的方案(可行!) 没问题,这个方案完全可行!要让你在Ubuntu 20.04 + OpenSSL 1.1.1环境下开发的自定义OpenSSL引擎支持openssl dgst命令行的摘要签名操作,核心是确保引擎实现了OpenSSL命令行工具依赖的密钥管理和签名回调接口,同时正确完成引擎的注册、加载和命令行参数配置。下面是具体的操作步骤和关键注意事项:
1. 补全引擎的核心接口实现
openssl dgst -sign底层会调用OpenSSL的EVP_PKEY签名框架,所以你的引擎必须实现对应的ECDSA密钥处理和签名/验签回调:
- 定义并填充
EVP_PKEY_METHOD结构体,关联你的自定义ECDSA签名逻辑:static const EVP_PKEY_METHOD your_ecdsa_pkey_meth = { EVP_PKEY_EC, // 指定密钥类型为EC .sign = your_custom_ecdsa_sign, // 替换为你的ECDSA签名实现函数 .verify = your_custom_ecdsa_verify, // 替换为你的ECDSA验签实现函数 // 其他必要的字段(如初始化、清理函数)按需填充 }; - 在引擎的初始化函数中,注册这个密钥方法:
这一步是让OpenSSL知道你的引擎可以处理ECDSA类型的密钥操作。ENGINE_set_pkey_meths(your_engine_ptr, &your_ecdsa_pkey_meth);
2. 确保引擎能被OpenSSL命令行加载
- 安装引擎库:将编译好的引擎
.so文件放到OpenSSL默认的引擎目录(Ubuntu 20.04一般是/usr/lib/x86_64-linux-gnu/engines-1.1/),或者通过--prefix参数指定自定义安装路径。 - 指定引擎ID或路径:如果引擎注册了唯一ID(通过
ENGINE_set_id(your_engine_ptr, "your_engine_id");设置),可以直接用-engine your_engine_id调用;如果没安装到默认目录,也可以直接指定引擎库的绝对路径:-engine /path/to/your/engine.so。
3. 正确使用openssl dgst命令行
完整的签名命令格式应该是这样的:
openssl dgst -engine <your_engine_id> -sha256 -sign /path/to/your_ec_private_key.pem -out signature.bin input_file.txt
各参数说明:
-engine <your_engine_id>:指定要使用的自定义引擎-sha256:指定摘要算法(如果你的引擎内置了SHA256实现,OpenSSL会自动关联;如果引擎只处理签名,会用OpenSSL原生的SHA256生成摘要后再交给引擎签名)-sign /path/to/your_ec_private_key.pem:指定ECDSA私钥文件(如果你的引擎使用自定义密钥格式,需要额外实现密钥导入逻辑,比如通过openssl engine的控制命令提前加载密钥)-out signature.bin:输出签名结果文件input_file.txt:需要签名的原始文件
如果你的引擎需要先导入密钥,可以先执行:
openssl engine -t -c <your_engine_id> -keyform PEM -in /path/to/private_key.pem
(具体参数取决于你在引擎中实现的ENGINE_ctrl回调逻辑)
4. 调试与验证
- 遇到错误时,开启OpenSSL调试日志排查:
export OPENSSL_DEBUG=1 openssl dgst ... # 重新执行命令 - 验证签名的命令:
openssl dgst -engine <your_engine_id> -sha256 -verify /path/to/your_ec_public_key.pem -signature signature.bin input_file.txt
5. OpenSSL 1.1.1兼容性提示
OpenSSL 1.1.1的引擎API相比1.0.2有不少变更,确保你的引擎代码使用的是1.1.1的原生API(比如避免使用已废弃的ENGINE_load_private_key等旧接口),否则可能出现加载失败或功能异常。
内容的提问来源于stack exchange,提问作者coolddd
相关产品推荐
相关产品推荐

