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 BIOfilter类型,将数据从一个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源代码结构的更多相关文章

  1. Android相框 与 源代码结构

    一. Android 相框 Android框架层级 : Android 自下 而 上 分为 4层; -- Linux内核层; -- 各种库 和 Android执行环境层; -- 应用框架层; -- 应 ...

  2. Openssl源代码整理学习---含P7/P10/P12说明

    声明:建议结合Openssl源代码学习: 一.基础知识 1.Openssl 简史 OpenSSL项目是加拿大人Eric A.Yang 和Tim J.Hudson开发,现在有Openssl项目小组负责改 ...

  3. Openssl源代码整理学习

    一.基础知识 1.Openssl 简史 OpenSSL项目是加拿大人Eric A.Yang 和Tim J.Hudson开发,现在有Openssl项目小组负责改进和维护:他们是全球一些技术精湛的志愿技术 ...

  4. MINA2 源代码学习--源代码结构梳理

    一.mina总体框架与案例: 1.总体结构图: 简述:以上是一张来自网上比較经典的图,总体上揭示了mina的结构,当中IoService包括clientIoConnector和服务端IoAccepto ...

  5. Android 源代码结构(转)

    简介 在使用Andriod SDK进行应用程序开发的时候,我们需要对源代码进行调试,有可能需要进入到某个Android API函数内部进行跟踪调试.但是,如果目标版本的SDK没有关联对应版本的源代码的 ...

  6. Android 源代码结构

    简介 在使用Andriod SDK进行应用程序开发的时候,我们需要对源代码进行调试,有可能需要进入到某个Android API函数内部进行跟踪调试.但是,如果目标版本的SDK没有关联对应版本的源代码的 ...

  7. 升讯威微信营销系统开发实践:(4)源代码结构说明 与 安装部署说明( 完整开源于 Github)

    GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...

  8. ABP项目启动及源代码结构

    在整体介绍ABP项目之前我们需要从官方网站下载模板项目,下载以后放到一个本地目录下,启动VS打开源代码.具体下载的步骤如下: 一   创建ABP项目模板 1 进入官方网站然后选择特定的样板项目. 2 ...

  9. Android 5.0 源代码结构

    本节书摘来自异步社区<深入理解Android 5 源代码>一书中的第2章,第2.2节分析Android源代码结构,作者 李骏. 网址:https://yq.aliyun.com/artic ...

随机推荐

  1. webpack配置antd的按需加载

    安装babel-plugin-import插件.下面方法二选一,都可以实现antd的按需加载. 一.配置webpack.config.js文件 { test: /.jsx?$/, exclude: / ...

  2. JMeter性能测试中控制业务比例

    性能测试混合场景中,我们需要组合多个业务操作到场景中来.比如有一个论坛的业务分布如下:发布新帖与回复帖子的比例为2:3,那么我们在JMeter测试计划中如何控制其比例呢? 可以通过以下两种方式解决:多 ...

  3. Django与supervisor 管理进程

    1.前言 在Django项目中,我们需要用到一些独立于Django框架外的脚本.这样一些脚本可能需要独立的持续运行,且具有很强的可维护性,这个时候supervisor就可以排上用场了. 基于pytho ...

  4. 如何根据checkbox的值进行勾选!例:我要勾选value等于scanbuy,terminal的复选框!

    微商城 随手购 自助购 <div class="controls" id="client"> <input id="mall&quo ...

  5. css3的动画

    一.CSS3变形 CSS3变形是一些效果的集合 如平移.旋转.缩放.倾斜效果 每个效果都可以称为变形(transform),它们可以分别操控元素发生平移.旋转.缩放.倾斜等变化 二.CSS3位移:tr ...

  6. 区块链侧链应用开发平台Asch节点安装及区块生产教程

    1 系统要求 必须是linux系统 必须有公网ip 建议使用ubuntu 14.04 64位 建议内存1G以上 建议带宽2Mb以上 2 安装 2.1 下载 wget https://www.asch. ...

  7. Python3.6 提示 ModuleNotFoundError: No module named '_ssl' 模块问题

    国内 163 yum 源挺好用 (中科大的也不错) http://mirrors.163.com/.help/CentOS6-Base-163.repo yum install openssl-dev ...

  8. Codeforces 1154E - Two Teams - [线段树+链表]

    题目链接:https://codeforces.com/contest/1154/problem/E 题意: $n$ 个人排成一排,第 $i$ 个人的能力值为 $a[i]$,$a[1 \sim n]$ ...

  9. [ionic3.x开发记录]ng-content使用

    在ionic开发公用组件的时候,我一直在想有没有angular有没有像vue一样的slot插槽.方便组件后期扩展. 然后去翻文档,发现有ng-content这么个东西,用法很像vue的slot. 组件 ...

  10. javascript 的引入

    目录 一.静态引入 1. html标签script引入 2. esm 中import ModuleName from 'module/path' 3. commonjs 中 const ModuleN ...