1
Openssl 编程
江南计算技术研究所
赵春平 著
Email: forxy@126.com
版本: 1.0
2
前言
最早接触 openssl 是做硕士论文的时候,研究网格安全。实际工作
是替换 globus 中 openssl 实现的 gssapi(对称算法和非对称算法)的底层
算法。初次接触 openssl,都不知道怎么下手,我用了最笨的方法来
替换对称算法:将 RC4 关键字替换掉,换成自己的对称算法。虽然
最后也做完了,客户端支持读卡器之类的硬件,服务端支持 pkcs11
接口的 PCI 密码卡。但是做完之后也不知道有没用过(只有我自己测
试过,从来没有跟其他系统联调过),因为 globus 很多还是用 java 来
实现的。没见过巨型机长啥样,也没有网格应用环境,我的研究也就
是理论研究而已。由于有些原因,第一年的硕士答辩没参加,延迟与
一年。主要是论文没准备好,并且春节刚好家里有事情。第二年答辩
勉强过。结果,省里后来抽检硕士论文,我的论文不合格。郁闷不已。
所以我要写这篇文章,是动机之一了。
后来做 PMI,要做属性证书编解码。我又把 openssl 拿起来了,单
独剥离了 asn1 模块。对 openssl 有更深的了解。我又没有记笔记的习
惯,知道一点就在电脑上记录一点,甚至还把 window 下 openssl 提
供的所有接口都写在一个文件里面。会一个函数就写一个,注释一个。
时间长了,也有一定积累了。干脆,写本书得了。不过,openssl 很
多方面我到现在还是不清楚。有时候学习一个函数还得专门写程序来
学习和调试它。有时候对我而言,学习是快乐的。我大概花了好几个
月的时间在家里写代码调试程序,最终完成这本书。
在 openssl.cn 论坛混了个斑竹当当,回答些问题,也是我学习
3
的动力之一。作为斑竹,我为不能回答的问题而汗颜。
评定职称需要论文的。本来想得很理想:出书,评职称。结果写
出来也没太大用处。我甚至想过每一章节去投稿,但是那样太慢了,
我也懒得去弄,就放弃了。2001 年本科毕业,到现在还是助理工程
师,我是不是太笨了。研究生也读的不咋的,我都不知道我现在算本
科生还是研究生。
有时候我在家写书的时候,老婆打电话来,我就说忙着呢,写书
呢。我老婆听了挺高兴。等到写完了,开始还问我,写得书怎么样了,
我就跟她说,纯属个人爱好。现在,她再也不问我了。所以,还是得
感谢老婆大人滴。
公开本文档适用于 openssl.cn 论坛。其他网站未经作者许可严禁
转载。
4
第一章 基础知识.....................................................................................................................10
1.1 对称算法.....................................................................................................................10
1.2 摘要算法.....................................................................................................................10
1.3 公钥算法.....................................................................................................................11
1.4 回调函数.....................................................................................................................13
第二章 openssl 简介................................................................................................................15
2.1 openssl 简介................................................................................................................15
2.2 openssl 安装................................................................................................................15
2.2.1 linux 下的安装................................................................................................15
2.2.2 windows 编译与安装 .....................................................................................15
2.3 openssl 源代码............................................................................................................16
2.4 openssl 学习方法........................................................................................................18
第三章 堆栈.............................................................................................................................19
3.1 openssl 堆栈................................................................................................................19
3.2 数据结构.....................................................................................................................19
3.3 源码.............................................................................................................................19
3.4 定义用户自己的堆栈函数.........................................................................................20
3.5 编程示例.....................................................................................................................21
第四章 哈希表.........................................................................................................................23
4.1 哈希表.........................................................................................................................23
4.2 哈希表数据结构.........................................................................................................23
4.3 函数说明.....................................................................................................................24
4.4 编程示例.....................................................................................................................26
第五章 内存分配.....................................................................................................................29
5.1 openssl 内存分配........................................................................................................29
5.2 内存数据结构.............................................................................................................29
5.3 主要函数.....................................................................................................................30
5.4 编程示例.....................................................................................................................30
第六章 动态模块加载.............................................................................................................32
6.1 动态库加载.................................................................................................................32
6.2 DSO 概述....................................................................................................................32
6.3 数据结构.....................................................................................................................
32
6.4 编程示例.....................................................................................................................33
第七章 抽象 IO .......................................................................................................................36
7.1 openssl 抽象 IO ..........................................................................................................36
7.2 数据结构.....................................................................................................................36
7.3 BIO 函数....................................................................................................................37
7.4 编程示例.....................................................................................................................38
7.4.1 mem bio...........................................................................................................38
7.4.2 file bio .............................................................................................................38
7.4.3 socket bio ........................................................................................................39
7.4.4 md BIO............................................................................................................41
7.4.5 cipher BIO.......................................................................................................41
7.4.6 ssl BIO.............................................................................................................42
5
7.4.7 其他示例.........................................................................................................44
第八章 配置文件.....................................................................................................................45
8.1 概述.............................................................................................................................45
8.2 openssl 配置文件读取................................................................................................45
8.3 主要函数.....................................................................................................................45
8.4 编程示例.....................................................................................................................46
第九章 随机数.........................................................................................................................48
9.1 随机数.........................................................................................................................48
9.2 openssl 随机数数据结构与源码................................................................................48
9.3 主要函数.....................................................................................................................49
9.4 编程示例.....................................................................................................................50
第十章 文本数据库.................................................................................................................52
10.1 概述.........................................................................................................................52
10.2 数据结构.................................................................................................................52
10.3 函数说明.................................................................................................................53
10.4 编程示例.................................................................................................................53
第十一章 大数.........................................................................................................................56
11.1 介绍.............................................................................................................................56
11.2 openssl 大数表示........................................................................................................56
11.3 大数函数.....................................................................................................................56
11.4 使用示例.....................................................................................................................59
第十二章 BASE64 编解码 .....................................................................................................66
12.1 BASE64 编码介绍 .....................................................................................................66
12.2 BASE64 编解码原理..................................................................................................66
12.3 主要函数.................................................................................................................67
12.4 编程示例.................................................................................................................67
第十三章 ASN1 库..................................................................................................................70
13.1 ASN1 简介..................................................................................................................70
13.2 DER 编码....................................................................................................................71
13.3 ASN1 基本类型示例..................................................................................................71
13.4 openssl 的 ASN.1 库..................................................................................................
74
13.5 用 openssl 的 ASN.1 库 DER 编解码....................................................................75
13.6 Openssl 的 ASN.1 宏..................................................................................................76
13.7 ASN1 常用函数..........................................................................................................77
13.8 属性证书编码...........................................................................................................90
第十四章 错误处理.................................................................................................................95
14.1 概述.........................................................................................................................95
14.2 数据结构.................................................................................................................95
14.3 主要函数.................................................................................................................97
14.4 编程示例.................................................................................................................99
第十五章 摘要与 HMAC......................................................................................................102
15.1 概述.......................................................................................................................102
15.2 openssl 摘要实现......................................................................................................102
15.3 函数说明...............................................................................................................102