提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
由于openssl工具集体量大,网上编程示例又杂多,本文旨在给出一个基于openssl应用接口编程思路。
一、适用于
该经验方法适用于所有的,可以通过openssl命令行工具实现,但开发者需要通过代码方式实现的到自己工程的功能。
二、code思路
1.确定接口功能,确定openssl命令该怎么敲
openssl所有的command
通过 openssl help
列举:
openssl常用命令行可参考以下链接:openssl命令速查
比如,我想要生成一个国密SM2算法的私钥,则,应该使用此命令:
openssl ecparam -genkey -name SM2 -out CA.pem
2.通过命令行,找到openssl如何代码实现处
以 上述生成sm2私钥为例:
定位到该命令行功能代码
命令行中ecparam
属于openssl子命令,apps下搜索ecparam_main,代码实现在apps/ecparam.c => int ecparam_main(int argc, char **argv)
openssl的命令行工具的代码(目录apps/下) 结构都是一个模板,例如定位enc子命令则搜索enc_main,x509命令搜x509_main
3.分析命令工具代码
根据command参数,掌握自己需实现的功能的逻辑流程
OPTIONS结构体数组列举额了该command所有支持参数,还是以ecparam command为例
const OPTIONS ecparam_options[] = {
{"help", OPT_HELP, '-', "Display this summary"},
{"inform", OPT_INFORM, 'F', "Input format - default PEM (DER or PEM)"},
{"outform", OPT_OUTFORM, 'F', "Output format - default PEM"},
{"in", OPT_IN, '<', "Input file - default stdin"},
{"out", OPT_OUT, '>', "Output file - default stdout"},
{"text", OPT_TEXT, '-', "Print the ec parameters in text form"},
{"C", OPT_C, '-', "Print a 'C' function creating the parameters"},
{"check", OPT_CHECK, '-', "Validate the ec parameters"},
{"list_curves", OPT_LIST_CURVES, '-',
"Prints a list of all curve 'short names'"},
{"no_seed", OPT_NO_SEED, '-',
"If 'explicit' parameters are chosen do not use the seed"},
{"noout", OPT_NOOUT, '-', "Do not print the ec parameter"},
{"name", OPT_NAME, 's',
"Use the ec parameters with specified 'short name'"},
{"conv_form", OPT_CONV_FORM, 's', "Specifies the point conversion form "},
{"param_enc", OPT_PARAM_ENC, 's',
"Specifies the way the ec parameters are encoded"},
{"genkey", OPT_GENKEY, '-', "Generate ec key"},
OPT_R_OPTIONS,
#ifndef OPENSSL_NO_ENGINE
{"engine", OPT_ENGINE, 's', "Use engine, possibly a hardware device"},
#endif
{NULL}
};
参数-genkey
-name
-out
使ecparam_main()中参数解析时switch 依次进入OPT_GENKEY、OPT_NAME、OPT_OUT
进行变量初始化,然后就是大规模的if-else走功能流程。
于是,通过阅读该逻辑走向,该功能的代码实现你就完全掌握了。
4.参考代码实现自己的功能
通过 xxx_main的代码,复制粘贴+定制化修改,完成自己的功能or api;
总结
在涉及到密钥、PKI相关开发,都能想到openssl工具集,但从毫无了解到基于openssl进行应用编程开发并不能很快入门-- openssl内容体积比较大: 密码算法基础、命令工具集合、BIO抽象内存管理、各种结构体…什么BIO,X509,PEM 。。。
指路一个博主,他的文章对这些都有很详细的整理,respect.
https://blog.csdn.net/liao20081228/category_7058952.html