OpenSSL源码简介

1、X.509标准

x509是由国际电信联盟(ITU-T)制定的数字证书标准;包含公钥和用户标志符、CA等;

x509是数字证书的规范,P7和P12是两种封装形式;X.509是常见通用的证书格式。所有的证书都符合为Public key Infrastructure 制定的ITU-T x509国际标准。

PKCS # 7常用的后缀是: P7B, P7C, SPC

PKCS # 12常用的后缀有: P12 ,PFX

X.509 DER编码(ASCII)的后缀是: DER CER CRT

X.509PEM编码(base64)的后缀是:PEM CER CRT

pem格式是经过base64编码的证书,der格式是DER编码的证书;

证书入和导出操作支持四种文件格式。

  • 个人信息交换 (PKCS #12)
    个人信息交换格式(PFX,也称为 PKCS #12)支持安全存储证书、私钥和证书路径中的所有证书。PKCS #12 是唯一可用于导出证书及其私钥的文件格式。
  • 加密消息语法标准 (PKCS #7)
    PKCS #7 格式支持存储证书和证书路径中的所有证书
  • DER 编码的二进制 X.509
    区别编码规则 (DER) 格式支持存储单个证书。该格式不支持存储私钥或证书路径。
  • Base64 编码的 X.509
    Base64 格式支持存储单个证书。该格式不支持存储私钥或证书路径。

cer/crt证书: 用于存储公钥证书的文件格式,它是二进制存放的,不含私钥,不能导入到个人存储区,因为个人存储区存储与私钥相关的数字证书;cer、crt格式只是一个后缀,该后缀的证书可以pem编码的也可以是der编码的; 

pfx/p12证书:含有证书和对应的 私钥,可以导入IE的个人证书存储区;

p12格式的证书一般用于证书的分发,里面包含了证书和对应的私钥;

由于Apache Proxy是PEM格式Prefer的,不支持DER经编码的证书,因此,要通过证书的编码转换,把DER编码转换为PEM编码,再经Apache处理。

证书的编码为DER编码,但DER编码的文件是二进制格式不利于读写和传播,所以对DER编码的数据进行BASE64编码形成了PEM。

2、PKCS系列标准

由RSA数字安全公司但呢个制定的公钥密码学标准,包含证书申请、更新、CRL、DS等;

其中PKCS7,定义了通用的消息语法,含数字签名和加密,与PEM兼容,互相转化;

PKCS12,描述个人信息交换语法,打包公钥、私钥、证书和其他信息;

PKCS 全称是 Public-Key Cryptography Standards ,是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准,PKCS 目前共发布过 15 个标准。 常用的有:
PKCS#7 Cryptographic Message Syntax Standard
PKCS#10 Certification Request Standard
PKCS#12 Personal Information Exchange Syntax Standard

比较:

P7一般是把证书分成两个文件,一个公钥一个私钥,有PEM和DER两种编码方式。PEM比较多见,就是纯文本的,P7一般是分发公钥用,看到的就是一串可见字符串,扩展名经常是.crt,.cer,.key等。DER是二进制编码。

P12是把证书压成一个文件,.pfx 。主要是考虑分发证书,私钥是要绝对保密的,不能随便以文本方式散播。所以P7格式不适合分发。.pfx中可以加密码保护,所以相对安全些。

在实践中要中,用户证书都是放在USB Key中分发,服务器证书经常还是以文件方式分发。服务器证书和用户证书,都是X509证书,就是里面的属性有区别。

3、Openssl源码分析

1.简介

开源SSL安全工具,包含SSL协议实现,大量软算法(对称/非对称/摘要),非对称算法密钥生成,ASN.1编解码库、证书请求(pscs10) 编解码,数字证书、CRL编解码,OCSP协议,pkcs7标准实现和pkcs12个人数字证书格式实现等功能;

使用C语言开发,跨平台优越;

2.源码框架

主要由eay基础函数库、ssl库、工具、demo和test组成;

Eay库源码,在crypto目录下,包含:

1) asn.1 DER编码解码(crypto/asn.1目录),包含数字证书请求,CRL吊销列表及pkcs8编解码函数;

2) 抽象IO(BIO,crypto/bio目录),包含各种输入输出抽象,文件、内存、stdio、socket、SSL;

3) 大数运算(crypto/bn目录),用于非对称算法密钥生成和各种加解密;

4) 字符缓存(crypto/buffer目录);

5) 配置文件读取(crypto/conf 目录),主要配置文件为openssl.cnf。本目录实现改格式配置文件的读取;

6) DSO动态共享对象(crypto/dso目录),抽象各平台动态库加载函数,提供统一接口;

7) 硬件引擎(crypto/engine目录),提供了规定接口;

8) 错误处理(cryto/err目录),提供处理接口;以堆栈显示错误;

9) 对称算法、非对称算法及摘要算法封装(crypto/evp目录)

10) HMAC(crypto/hmac目录),实现基于对称算法的MAC;

11) Hash表(crypto/lhash目录),实现散列表数据结构;

12) OCSP数字证书在线认证(crypto/ocsp目录),实现ocsp协议的编解码等;

13) PEM文件格式处理(crypto/pem目录),生成和读取PEM文件;

14) Pkcs7消息语法(crypto/pkcs7目录),实现构造和解析PKCS7消息;

15) Pkcs12个人证书格式(crypto/pkcs12目录),实现pkcs12证书构造和解析;

16) 队列(crypto/pqueue目录),实现队列数据结构,用于DTLS;

17) 随机数(crypto/rand目录),实现伪随机数生成,支持用户自定义;

18) 堆栈(crypto/rand目录),实现堆栈数据结构;

19) 线程支持(crypto/threads),openssl支持多线程,但是用户必须实现相关接口;

20) 文本数据库(crypto/txt_db目录);

21) X509数字证书(crypto/x509目录),包括数字证书申请、证书和CRL构造解析和签名验证;

22) 对称算法(crypto/aes、crypto/bf、crypto/cast、crypto/omp和crypto/des等);

23) 非对称算法(crypto/dh、crypto/dsa、crytpo/ec和crypto/ecdh);

24) 摘要算法(crypto/md2/4/5/sha)以及密钥交换/认证算法(crypto/dh和crypto/krb5);

 

SSL库源代码在ssl目录下,包含sslv2,sslv3,tlsv1和DTLS的源码;包含客户端源码、服务器源码、通用、底层包、方法以及协议相关密钥计算源码;

工具源码在crypto/apps目录;demo中有硬件引擎engines源码;测试源码在test中;

 

 摘自:https://www.cnblogs.com/testlife007/p/6699566.html

 更多源码分析可参考:《Openssl编程》

 

猜你喜欢

转载自www.cnblogs.com/xdyixia/p/11690892.html