openssl源代码结构
Openssl整个软件包主要包括三个主要的功能模块:密码算法库,SSL协议库,应用程序;
应用程序:主要包括密钥生成,证书管理,格式转换,数据加密,签名,SSL测试等。
evp,对称算法,非对称算法,摘要算法的封装。
随机数的生成,管理;
最基本的数据结构,struct 大数数组, EC_point 椭圆曲线点结构,
openssl编译的命令:
./config (之后需要加一些全局性的选型,--openssldir=OPENSSLDIR安装目录),默认是usr/local/ssl
--prefix,设置lib,include,bin的目录。
shared,生成动态链接库,
算法选项,no-des,no-ec等,选择是否编译某种算法。
make
make install
openssl中的签名文件:
X509,通常是指满足X.509 V3的一个数字文件,标准RFC5280。
X509是最基本的证书格式,规范。PKCS标准是具体的针对不同应用场景的封装格式,是基于x509的。
X509文件的编码常用的有两种,DER:二进制的文件编码,不可读。
PEM:ASCII Base64编码的文件。
X509文件的三种扩展,crt,一般linux用的较多的证书后缀,内部编码不限,其中包含公钥,不含私钥。
cer,一般window下用的较多的证书后缀,内部编码不限,其中包含公钥,不含私钥。
.key格式扩展,一般用在PKCS#8中。
crt的扩展格式和cer的扩展格式,可以相互转换格式,但是内部的编码必须相同。(DER对应DER,PEM对应PEM)。
DER的编码是基于ASN1的语言标准的,编码之后,类似于二进制的bin文件。(ASN1是语言编码标准,DER是具体的编码实现)。
查看PEM编码的证书:
openssl x509 -in cert.pem -text -noout
openssl x509 -in cert.crt -text -noout
openssl x509 -in cert.cer -text -noout
查看DER编码的证书:
openssl x509 -in certificate.der -inform der -text -noout
相互格式转换:
openssl x509 -in cert.crt -outform der -out cert.der
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
base64到二进制文件的转换:
openssl base64 -in file.bin -out file.64
openssl base64 -d -in file.b64 -out file.bin
Openssl使用pem文件格式存储证书和密钥,PEM中除去标记,实质上是Base64编码的二进制内容。
生成rsa私钥的命令:openssl genrsa -out private_rsa.pem 1024
生成rsa公钥的命令:openssl rsa -in private_rsa.pem -pubout -out public_rsa.pem
genrsa,产生的是一组rsa的密钥,其中已经包括公钥,生成公钥的命令,只是提取出其中的公钥,编码为pem格式。
以明文的方式查看rsa密钥的各个参数值:openssl rsa -in private_rsa.pem -text -out private.txt
rsa公钥转换为PKCS#8格式:pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
生成ecc证书:
openssl ecparam -out EccCA.key -name prime256v1 -genkey
openssl req -key EccCA.key -new -out EccCA.req
openssl X509 -req -in EccCA.req -signkeyEccCA.key -out EccCA.pem
PEM文件格式:(标准RFC1421-1424)
将一个对象保存为PEM格式的文件,1) 信息转换为ASCII码;
2) 使用对称加密算法转换邮件;(可选)
3) 使用base64对邮件进行编码处理;
4) 如果使用加密算法,使用头信息格式来指定算法,数据等信息;
5) 加上头、尾标注信息。
pem格式在openssl中的定义以及调用函数:
https://blog.csdn.net/liao20081228/article/details/77185513
openssl中的i2d,d2i系列函数,表征,将internal object转换为DER类型的编码,或者将DER类型的编码转换为internal类型的object。
TYPE *d2i_TYPE(TYPE **a, unsigned char **pp, long length);
TYPE *d2i_TYPE_bio(BIO *bp, TYPE **a);
TYPE *d2i_TYPE_fp(FILE *bp, TYPE **a);
int i2d_TYPE(TYPE **a, unsigned char **pp);
int i2d_TYPE_bio(BIO *bp, TYPE **a);
int i2d_TYPE_fp(FILE *bp, TYPE **a);
_bio类型,表示数据接口为bio port,_fp类型,表示数据接口为file point。
_bio和_fp类型内部都是调用i2d/d2i_type类型。BIO和FP类型都被转换为char类型。
d2i,i2d类型函数的定义和实现参考:
https://blog.csdn.net/u010129119/article/details/53811622
在X509.pod中可以看到所有支持的D2I/I2D_TYPE类型的函数。
ssl主要通过BIO和EVP的两种结构,实现安全套接字的协议。BIO主要是实现套接字的封装;EVP实现对内部算法的封装。
BIO:
BIO是封装了许多类型I/O接口细节的一种应用接口,可以和SSL连接,非加密的网络连接,文件I/O进行透明的连接。
主要分为两种,source/sink类型,如socket BIO,file BIO;filter类型,将数据从一个BIO转换到另一个BIO,转换代表hash,enc,dec等操作。
各种类型的BIO函数介绍:
https://blog.csdn.net/liao20081228/article/details/77193729
EVP:
evp主要包括:摘要,对称算法,非对称算法的内核,filter BIO的实现。
所有的engine可以通过调用OpenSSL_add_all_algorithms或者自己初始化engine函数指针。
各种函数的详细介绍:
https://blog.csdn.net/liao20081228/article/details/76285896
基于ssl接口和BIO接口的openssl api调用,实现client,server的加解密服务:
https://blog.csdn.net/gx_1983/article/details/47958323
https://blog.csdn.net/howeverpf/article/details/18993945
openssl源代码结构的更多相关文章
- Android相框 与 源代码结构
一. Android 相框 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android执行环境层; -- 应用框架层; -- 应 ...
- Openssl源代码整理学习---含P7/P10/P12说明
声明:建议结合Openssl源代码学习: 一.基础知识 1.Openssl 简史 OpenSSL项目是加拿大人Eric A.Yang 和Tim J.Hudson开发,现在有Openssl项目小组负责改 ...
- Openssl源代码整理学习
一.基础知识 1.Openssl 简史 OpenSSL项目是加拿大人Eric A.Yang 和Tim J.Hudson开发,现在有Openssl项目小组负责改进和维护:他们是全球一些技术精湛的志愿技术 ...
- MINA2 源代码学习--源代码结构梳理
一.mina总体框架与案例: 1.总体结构图: 简述:以上是一张来自网上比較经典的图,总体上揭示了mina的结构,当中IoService包括clientIoConnector和服务端IoAccepto ...
- Android 源代码结构(转)
简介 在使用Andriod SDK进行应用程序开发的时候,我们需要对源代码进行调试,有可能需要进入到某个Android API函数内部进行跟踪调试.但是,如果目标版本的SDK没有关联对应版本的源代码的 ...
- Android 源代码结构
简介 在使用Andriod SDK进行应用程序开发的时候,我们需要对源代码进行调试,有可能需要进入到某个Android API函数内部进行跟踪调试.但是,如果目标版本的SDK没有关联对应版本的源代码的 ...
- 升讯威微信营销系统开发实践:(4)源代码结构说明 与 安装部署说明( 完整开源于 Github)
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...
- ABP项目启动及源代码结构
在整体介绍ABP项目之前我们需要从官方网站下载模板项目,下载以后放到一个本地目录下,启动VS打开源代码.具体下载的步骤如下: 一 创建ABP项目模板 1 进入官方网站然后选择特定的样板项目. 2 ...
- Android 5.0 源代码结构
本节书摘来自异步社区<深入理解Android 5 源代码>一书中的第2章,第2.2节分析Android源代码结构,作者 李骏. 网址:https://yq.aliyun.com/artic ...
随机推荐
- blur和click事件冲突
一.问题描述文本框的blur事件和div元素的click事件出现冲突.在input的blur事件中,我们隐藏div元素.在div的click事件中,我们清除input的内容,并隐藏自身.当我们在inp ...
- 第六篇 flask中session
Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 Flask 中 session 的使用 1. Flask 中 session 是 ...
- php获取文章的第一张图片
今天做东西的时候遇到一个问题就是如何把文章提取出来作为文章列表呢? 因为用了Ueditor,所以提交的数据包含了html标签. 搜索了一会找到了一个方案,用php自带的函数去掉了html标签. $ar ...
- 关于DTO的理解
转自大神loveis715博文:http://www.cnblogs.com/loveis715/p/4379656.html 在一个web服务的实现中,我们常常需要访问数据库,并将从数据库中取得的数 ...
- Gparted Live分区调整
由于年少无知,在安装ubuntu系统的时候,以为/temp是软件包安装时解压的缓冲,所以给/temp留了10G,而以为/var只是记录一些log而已,因此把仅存的1G分配给了它.随后在安装软件时出现“ ...
- Python练手例子(7)
37.对10个数进行排序. 程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换. #python 3.7 if __n ...
- Python自学知识点----Day01
Linux 次方运算符** 操作系统:1).直接操纵硬件 2).将操纵硬件封装成系统调用,利用应用程序进行调用 操作系统:windows 用户群体大 macos 适用开发人员 Linux ...
- JMter随记
线程组( Threads (Users))理解:一个虚拟用户组,线程组内线程数量在运行过程中不会发生改变. 注意事项:线程间变量相互独立. 一个测试计划内可以包含多个线程组. 可定义内容: 取样器错误 ...
- angularjs知识点
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- WPF气泡样式弹窗效果
页面设计需求,做了一个气泡形状的弹出框,效果如下: 设计思路如下: 1. 使用Path绘制气泡的尖尖,将这个放到顶层: 2. 在用border绘制长方形框,将这个放到底层,并且设置Margin值,使得 ...