没有合适的资源?快使用搜索试试~ 我知道了~
首页OpenSSL编程实践与学习心得:从硕士论文到属性证书开发
OpenSSL编程实践与学习心得:从硕士论文到属性证书开发
需积分: 0 0 下载量 89 浏览量
更新于2024-06-30
收藏 1.31MB PDF 举报
《openssl编程1》由赵春平编著,他在江南计算技术研究所工作期间,通过对openssl的研究和实践,特别是在网格安全领域,尤其是对gssapi(包括对称和非对称算法)的底层替换,逐渐深入了解了这个强大的加密库。初识openssl时,赵春平采用了基础方法,如替换RC4关键字,实现了客户端读卡器支持和服务器对PKCS11接口的支持。然而,他的工作并未在实际环境中得到大规模验证,硕士论文也被抽检认定不合格。 赵春平撰写本书的动机源于两方面:一是弥补学术上的遗憾,二是应对工作中对openssl的深入需求,特别是属性证书编解码的项目。他没有详细记录的学习习惯,而是通过编写代码和实际操作不断积累经验,甚至成为openssl.cn论坛的版主,解答他人问题,这也成为他学习的动力。尽管他花费大量时间在家编写和调试代码,但出于出版物的实际价值和职称评定的需求,他并未选择将章节投稿,而是专注于个人兴趣的驱动。 这本书虽然初衷是希望提升自身技能和可能的学术认可,但实际结果并未完全符合预期。赵春平在学术晋升道路上遇到了挫折,本科毕业后仍停留在助理工程师的职位,这让他反思自己的职业发展路径。尽管如此,他对openssl的理解和实践经验对其他人来说是非常宝贵的资源,尤其是在面对复杂加密操作时。 《openssl编程1》提供了丰富的实例和深入剖析,涵盖了openssl的基本原理、公钥算法、回调函数、堆栈管理、数据结构以及源码解析等内容。读者不仅能学习到实用的编程技巧,还能感受到作者边实践边学习的坚韧精神。对于想要掌握openssl的开发者或对网络安全感兴趣的读者,这本书无疑是一本不可或缺的参考书籍。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/86310778/bg10.jpg)
16
5) 运行 perl Configure VC-WIN32,其他可选项参见 2.2.1 节;
6) ms\do_ms.bak
7) nmake -f ms\ntdll.mak(动态库)或者 nmake –f ms\nt.mak(静态库);
编译 debug 版本在 ms\do_ms.bat 中加上 debug,,见 INSTALL.W32,具体做法如下:
编辑 do_ms.bak,修改前内容如下:
perl util\mkfiles.pl >MINFO
perl util\mk1mf.pl no-asm VC-WIN32 >ms\nt.mak
perl util\mk1mf.pl dll no-asm VC-WIN32 >ms\ntdll.mak
perl util\mk1mf.pl no-asm VC-CE >ms\ce.mak
perl util\mk1mf.pl dll no-asm VC-CE >ms\cedll.mak
perl util\mkdef.pl 32 libeay > ms\libeay32.def
perl util\mkdef.pl 32 ssleay > ms\ssleay32.def
添加 debug 后如下:
perl util\mkfiles.pl >MINFO
perl util\mk1mf.pl debug no-asm VC-WIN32 >ms\nt.mak #添加 debug
perl util\mk1mf.pl debug dll no-asm VC-WIN32 >ms\ntdll.mak #添加 debug
perl util\mk1mf.pl debug no-asm VC-CE >ms\ce.mak #添加 debug
perl util\mk1mf.pl debug dll no-asm VC-CE >ms\cedll.mak #添加 debug
perl util\mkdef.pl 32 libeay > ms\libeay32.def
perl util\mkdef.pl 32 ssleay > ms\ssleay32.def
安装完毕后,生成的头文件放在 inc32 目录,动/静态库和可执行文件放在 outdll
目录。
另外用户可以在 windows 集成环境下建自己的工作环境,来编译 openssl,操作比
较烦琐,也可以从网上址下载已有的 vc6.0 工程。
2.3 openssl 源代码
openssl 源代码主要由 eay 库、ssl 库、工具源码、范例源码以及测试源码组成。
eay 库是基础的库函数,提供了很多功能。源代码放在 crypto 目录下。包括如下内
容:
1) asn.1 DER 编码解码(crypto/asn1 目录),它包含了基本 asn1 对象的编解码以及
数字证书请求、数字证书、CRL 撤销列表以及 PKCS8 等最基本的编解码函数。
这些函数主要通过宏来实现。
2) 抽象 IO(BIO,crypto/bio 目录),本目录下的函数对各种输入输出进行抽象,包括
文件、内存、标准输入输出、socket 和 SSL 协议等。
3) 大数运算(crypto/bn 目录),本目录下的文件实现了各种大数运算。这些大数运
算主要用于非对称算法中密钥生成以及各种加解密操作。另外还为用户提供了
大量辅助函数,比如内存与大数之间的相互转换。
4) 字符缓存操作(crypto/buffer 目录)。
5) 配置文件读取(crypto/conf 目录),openssl 主要的配置文件为 openssl.cnf。本目
录下的函数实现了对这种格式配置文件的读取操作。
6) DSO(动态共享对象,crypto/dso 目录),本目录下的文件主要抽象了各种平台的
动态库加载函数,为用户提供统一接口。
![](https://csdnimg.cn/release/download_crawler_static/86310778/bg11.jpg)
17
7) 硬件引擎(crypto/engine 目录),硬件引擎接口。用户如果要写自己的硬件引擎,
必须实现它所规定的接口。
8) 错误处理(crypto/err 目录),当程序出现错误时,openssl 能以堆栈的形式显示各
个错误。本目录下只有基本的错误处理接口,具体的的错误信息由各个模块提
供。各个模块专门用于错误处理的文件一般为*_err..c 文件。
9) 对称算法、非对称算法及摘要算法封装(crypto/evp 目录)。
10) HMAC(crypto/hmac 目录),实现了基于对称算法的 MAC。
11) hash 表(crypto/lhash 目录),实现了散列表数据结构。openssl 中很多数据
结构都是以散列表来存放的。比如配置信息、ssl session 和 asn.1 对象信息等。
12) 数字证书在线认证(crypto/ocsp 目录),实现了 ocsp 协议的编解码以及证书
有效性计算等功能。
13) PEM 文件格式处理(crypto/pem),用于生成和读取各种 PEM 格式文件,
包括各种密钥、数字证书请求、数字证书、PKCS7 消息和 PKCS8 消息等。
14) pkcs7 消息语法(crypto/pkcs7 目录),主要实现了构造和解析 PKCS7 消息;
15
) pkcs12 个人证书格式(crypto/pckcs12 目录),主要实现了 pkcs12 证书的构
造和解析。
16) 队列(crypto/pqueue 目录),实现了队列数据结构,主要用于 DTLS。
17) 随机数(crypto/rand 目录),实现了伪随机数生成,支持用户自定义随机数
生成。
18) 堆栈(crypto/stack 目录),实现了堆栈数据结构。
19) 线程支持(crypto/threads),openssl 支持多线程,但是用户必须实现相关接
口。
20) 文本数据库(crypto/txt_db 目录)。
21) x509 数字证书(crypto/x509 目录和 crypto/x509v3),包括数字证书申请、
数字证书和 CRL 的构造、解析和签名验证等功能了;
22) 对称算法(crypto/aes、crypto/bf、crypto/cast、ccrypto/omp 和 crypto/des 等
目录)。
23) 非对称算法(crypto/dh、crypto/dsa、crypto/ec
和 crypto/ecdh)。
24) 摘要算法(crypto/md2、crypto/md4、crypto/md5 和 crypto/sha)以及密钥交
换/认证算法(crypto/dh 和 crypto/krb5)。
ssl 库所有源代码在 ssl 目录下,包括了 sslv2、sslv3、tlsv1 和 DTLS 的源代码。各
个版本基本上都有客户端源码(*_clnt.c)、服务源码(*_srvr.c)、通用源码(*_both.c)、底层包源
码(*_pkt.c)、方法源码(*_meth.c)以及协议相关的各种密钥计算源码(*_enc.c)等,都很有规
律。
工具源码主要在 crypto/apps 目录下,默认编译时只编译成 openssl(windows 下为
openssl.exe)可执行文件。该命令包含了各种命令工具。此目录下的各个源码可以单独进行编
译。
范例源码在 demo 目录下,另外 engines 目录给出了 openssl 支持的几种硬件的
engines 源码,也可以作为 engine 编写参考。
测试源码主要在 test 目录下。
![](https://csdnimg.cn/release/download_crawler_static/86310778/bg12.jpg)
18
2.4 openssl 学习方法
通过学习 openssl,用户能够学到 PKI 方面的各种知识,其重要性不言而喻。以下
为学习 openssl 的方法,供参考。
1) 建立学习环境
建立一个供调试的 openssl 环境,可以是 windows 平台,也可以是 linux 或者其
他平台。用户需有在这些平台下调试源代码的能力。
2)学习 openssl 的命令
通过 openssl 命令的学习,对 openssl 有基本的了解。
3) 学习 openssl 源代码并调试
主要的源代码有:
apps 目录下的各个程序,对应于 openssl 的各项命令;
demos 下的各种源代码;
engines 下的各种 engine 实现;
test 目录下的各种源代码。
对于 openssl 函数的学习,主要查看 openssl 自身是如何调用的,或者查看函数的实
现。对于 openssl 中只有实现而没有调用的函数,读者需要自己写源码或研究源代
码去学习。
4) 学会使用 openssl 的 asn.1 编解码
openssl 中很多函数和源码都涉及到 asn1 编解码,比如数字证书申请、数字证
书、crl、ocsp、pkcs7、pkcs8、pkcs12 等。
5) 查找资料
Linux 下主要用
man 就能查看 openssl 命令和函数的帮助。Windows 用户可用
到 www.openss.org 去查看在线帮助文档,或者用 linux 下的命令 man2html 将帮助文
档装换为 html 格式。用户也可以访问 openssl.cn 论坛来学习 openssl。
6) 学习 openssl 相关书籍
读者可以参考《OpenSSL与网络信息安全--基础、结构和指令》、《Network
Security with OpenSSL》(OReilly出版)和《 OpenSSL for windows Developer’s Guide》。
![](https://csdnimg.cn/release/download_crawler_static/86310778/bg13.jpg)
19
第三章 堆栈
3.1 openssl 堆栈
堆栈是一种先进后出的数据结构。openssl 大量采用堆栈来存放数据。它实现了一
个通用的堆栈,可以方便的存储任意数据。它实现了许多基本的堆栈操作,主要有:堆
栈拷贝(sk_dup)、构建新堆栈(sk_new_null,sk_new)、插入数据(sk_insert)、删除数
据(sk_delete)、查找数据(sk_find,sk_find_ex)、入栈(sk_push)、出栈(sk_pop)、
获取堆栈元素个数(sk_num)、获取堆栈值(sk_value)、设置堆栈值(sk_set)和堆栈
排序(sk_sort)。
3.2 数据结构
openssl 堆栈数据结构在 stack.h 中定义如下:
typedef struct stack_st
{
int num;
char **data;
int sorted;
int num_alloc;
int (*comp)(const char * const *, const char * const *);
} STACK;
各项意义如下:
num: 堆栈中存放数据的个数。
data: 用于存放数据地址,每个数据地址存放在 data[0]到 data[num-1]中。
sorted: 堆栈是否已排序,如果排序则值为 1,否则为 0,堆栈数据一般是无序的,只
有当用户调用了 sk_sort 操作,其值才为 1。
comp: 堆栈内存放数据的比较函数地址,此函数用于排序和查找操作;当用户生成一
个新堆栈时,可以指定 comp 为用户实现的一个比较函数;或当堆栈已经存在
时通过调用 sk_set_cmp_func 函数来重新指定比较函数。
注意,用户不需要调用底层的堆栈函数(sk_sort、sk_set_cmp_func 等),而是调用他通过
宏实现的各个函数。
3.3 源码
openssl 堆栈实现源码位于 crypto/stack 目录下。下面分析了部分函数。
1) sk_set_cmp_func
此函数用于设置堆栈存放数据的比较函数。由于堆栈不知道用户存放的是什么
数据,所以,比较函数必须由用户自己实现。
2) sk_find
根据数据地址来查找它在堆栈中的位置。当堆栈设置了比较函数时,它首先对
![](https://csdnimg.cn/release/download_crawler_static/86310778/bg14.jpg)
20
堆栈进行排序,然后通过二分法进行查找。如果堆栈没有设置比较函数,它只是简
单的比较数据地址来查找.
3) sk_sort
本函数对堆栈数据排序。它首先根据 sorted 来判断是否已经排序,如果未排序
则调用了标准 C 函数 qsort 进行快速排序。
4) sk_pop_free
本函数用于释放堆栈内存放的数据以及堆栈本身,它需要一个由用户指定的针
对具体数据的释放函数。如果用户仅调用 sk_free 函数,则只会释放堆栈本身所用
的内存,而不会释放数据内存。
3.4 定义用户自己的堆栈函数
用户直接调用最底层的堆栈操作函数是一个麻烦的事情,对此 openssl 提供了用宏
来帮助用户实现接口。用户可以参考 safestack.h 来定义自己的上层堆栈操作函数,举例
如下,safestack.h 定义了如下关于 GENERAL_NAME 数据结构的堆栈操作:
#define sk_GENERAL_NAME_new(st) SKM_sk_new(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_new_null() SKM_sk_new_null(GENERAL_NAME)
#define sk_GENERAL_NAME_free(st) SKM_sk_free(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_num(st) SKM_sk_num(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_value(st, i) SKM_sk_value(GENERAL_NAME, (st), (i))
#define sk_GENERAL_NAME_set(st, i, val) SKM_sk_set(GENERAL_NAME, (st), (i), (val))
#define sk_GENERAL_NAME_zero(st) SKM_sk_zero(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_push(st, val) SKM_sk_push(GENERAL_NAME, (st), (val))
#define sk_GENERAL_NAME_unshift(st, val) SKM_sk_unshift(GENERAL_NAME, (st), (val))
#define sk_GENERAL_NAME_find(st, val) SKM_sk_find(GENERAL_NAME, (st), (val))
#define sk_GENERAL_NAME_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAME, (st),
(val))
#define sk_GENERAL_NAME_delete(st, i) SKM_sk_delete(GENERAL_NAME, (st), (i))
#define sk_GENERAL_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAME, (st),
(ptr))
#define sk_GENERAL_NAME_insert(st, val, i) SKM_sk_insert(GENERAL_NAME, (st), (val),
(i))
#define sk_GENERAL_NAME_set_cmp_func(st, cmp)
SKM_sk_set_cmp_func(GENERAL_NAME, (st), (cmp))
#define sk_GENERAL_NAME_dup(st) SKM_sk_dup(GENERAL_NAME, st)
#define sk_GENERAL_NAME_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAME,
(st), (free_func))
#define sk_GENERAL_NAME_shift(st) SKM_sk_shift(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_pop(st) SKM_sk_pop(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_sort(st) SKM_sk_sort(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAME, (st))
当用户想对 GENERAL_NAME 数据进行堆栈操作时,调用上面由宏定义的函数即可,
即直观又方便。比如用户想设置堆栈数据的比较函数和对堆栈排序时,他分别调用:
sk_GENERAL_NAME_set_cmp_func 和 sk_GENERAL_NAME_sort。
剩余310页未读,继续阅读
![application/octet-stream](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/35a0c421822a421c8dc50d112f4447ca_weixin_35775969.jpg!1)
型爷
- 粉丝: 22
- 资源: 337
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 新型矿用本安直流稳压电源设计:双重保护电路
- 煤矿掘进工作面安全因素研究:结构方程模型
- 利用同位素位移探测原子内部新型力
- 钻锚机钻臂动力学仿真分析与优化
- 钻孔成像技术在巷道松动圈检测与支护设计中的应用
- 极化与非极化ep碰撞中J/ψ的Sivers与cos2φ效应:理论分析与COMPASS验证
- 新疆矿区1200m深孔钻探关键技术与实践
- 建筑行业事故预防:综合动态事故致因理论的应用
- 北斗卫星监测系统在电网塔形实时监控中的应用
- 煤层气羽状水平井数值模拟:交替隐式算法的应用
- 开放字符串T对偶与双空间坐标变换
- 煤矿瓦斯抽采半径测定新方法——瓦斯储量法
- 大倾角大采高工作面设备稳定与安全控制关键技术
- 超标违规背景下的热波动影响分析
- 中国煤矿选煤设计进展与挑战:历史、现状与未来发展
- 反演技术与RBF神经网络在移动机器人控制中的应用
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)