openssl学习总结

openssl知识点总结

openssl实践总结

简介

openssl是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有:

SSL协议实现(包括SSLv2、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编解码、数字证书编解码、CRL编解码、OCSP协议、数字证书验证、PKCS7标准实现和PKCS12个人数字证书格式实现等功能。

  • linux下安装

1)解压openssl开发包文件;

2)运行./config --prefix=/usr/local/openssl

3)make test (用来测试是否安装成功)

4)make install

完成后,openssl会被安装到/usr/local/openssl目录,包括头文件目录include、可执行文件目录bin、man在线帮助、库目录lib以及配置文件目录

注意也有一种非常规安装方法,大多linux系统都集成了openssl开发环境,想要完成编程只需要在usr/include目录下加入头文件即可,可通过命令sudo apt-get install libssl-dev完成添加头文件

协议下的应用

RSA

  • 命令行下

openssl rsa

-inform DER|PEM|NET

指定输入的格式

-outform DER|PEM|NET

指定输出格式。

-in filename

输入文件名。

-passin arg

私钥保护密钥来源

-out filename

输出的文件名。

-des|-des3|-idea

指定私钥保护加密算法。

-text

打印密钥信息。

-noout

不打印任何信息。

-modulus

打印密钥模数。

-pubin

表明输入文件为公钥,默认的输入文件是私钥。

-pubout

表明输出文件为公钥。

-check

检查RSA私钥。

-openssl genrsa -out key.pem

生成明文私钥文件

openssl rsa -in key.pem -outform der -out key.der

转换为DER编码

openssl rsa -inform der -in key.der -des3 -out enckey.pem

将明文私钥文件转换为密码保护

openssl rsa -in key.pem -pubout -out pubkey.pem

将公钥写入文件

openssl rsa -pubin -in pubkey.pem –text -modulus

打印公钥信息

openssl rsa -in enckey.pem –passin file:pwd.txt

显示私钥信息,保护密钥写在pwd.txt

x509

  • 命令行下用法

openssl x509

-inform DER|PEM|NET

指定输入文件的格式,默认为PEM格式。

-outform DER|PEM|NET

指定输出文件格式,默认为PEM格式。

-keyform

指定私钥文件格式,默认为PEM格式。

-CAform

指定CA文件格式,默认为PEM格式。

-CAkeyform

指定CA私钥文件格式,默认为PEM格式。

-in filename

指定输入文件名。

-out filename

指定输出文件名。

-passin

指定私钥保护密钥来源

-serial

显示证书的序列号。

-subject_hash

显示持有者的摘要值。

-issuer_hash

显示颁发者的摘要值。

-hash

显示证书持有者的摘要值

-subject

显示证书持有者DN。

-issuer

显示证书颁发者DN。

-enddate

显示证书到期时间。

-startdate

显示证书的起始有效时间。

-purpose

显示证书用途。

-dates

显示证书的有效期。

-modulus

显示公钥模数。

-pubkey

输出公钥。

-fingerprint

打印证书微缩图。

-alias

显示证书别名。

-noout

不显示信息。

-ocspid

显示持有者和公钥的OCSP摘要值。

-trustout

输出可信任证书。

-clrtrust

清除证书附加项里所有有关用途允许的内容。

-clrreject

清除证书附加项里所有有关用途禁止的内容。

-addtrust arg

添加证书附加项里所有有关用途允许的内容。

-addreject arg

添加证书附加项里所有有关用途禁止的内容。

-setalias arg

设置证书别名。

-days arg

设置证书有效期。

-checkend arg

显示证书在给定的arg秒后是否还有效。

-signkey filename

指定自签名私钥文件。

-x509toreq

根据证书来生成证书请求

-req

输入为证书请求,需要进行处理。

-CA arg

设置CA文件,必须为PEM格式。

-CAkey arg

设置CA私钥文件,必须为PEM格式。

-CAcreateserial

如果序证书列号文件,则生成。

-CAserial arg

由arg指定序列号文件。

-set_serial

设置证书序列号。

-text

打印证书信息。

-C

用C语言格式显示信息。

-md2|-md5|-sha1|-mdc2

指定使用的摘要算法,缺省为MD5。

-extfile filename

指定包含证书扩展项的文件名

-clrext

删除证书所有的扩展项。当一个证书由另外一个证书生成时,可用此项。

-nameopt option

指定打印名字时采用的格式。

-certopt arg

当采用-text显示时,设置是否打印哪些内容

  • 主要函数

1)X509_STORE_add_cert

将证书添加到X509_STORE中。

2) X509_STORE_add_crl

将crl添加到X509_STORE中。

3) void X509_STORE_set_flags(X509_STORE *ctx, long flags)

将flags赋值给ctx里面的flags,表明了验证证书时需要验证哪些项。

4)X509_TRUST_set_default

设置默认的X509_TRUST检查函数。

5)int X509_verify(X509 *a, EVP_PKEY *r)

验证证书的签名。

6)X509_verify_cert

验证证书

7)X509_verify_cert_error_string

根据错误号,获取错误信息。

8)X509_add1_ext_i2d

根据具体的扩展项数据结构添加一个扩展项。

9)X509_add_ext

X509_EXTENSION堆栈中,在指定位置添加一项。

10)X509_ALGOR_dup

算法拷贝。

11)X509_alias_get0/X509_alias_set1

获取/设置别名。

12)X509_asn1_meth

获取X509的ASN1_METHOD,包括new、free、i2d和d2i函数。

13)X509_certificate_type

获取证书和公钥类型。

14)int X509_check_issued(X509 *issuer, X509 *subject);

检查subject证书是否由issuer颁发,如果是则返回X509_V_OK,即0。

15)X509_check_private_key

检查私钥与证书中的公钥是否匹配,匹配返回1。

16)X509_cmp

证书比较。

17) int X509_cmp_current_time(ASN1_TIME *s)

将s与当前时间进行比较,返回值小于0则s早于当前时间,大于0则s晚与当前时间。

18)int X509_cmp_time(ASN1_TIME *ctm, time_t *cmp_time)

如果ctm时间在cmp_time之后,则返回值大于0。

19) X509_delete_ext

删除扩展项堆栈中指定位置的扩展项。

20)X509_digest

根据指定的摘要算法对X509结构做摘要。

MD5

  • 编程API接口

int MD5_Init(MD5_CTX *c);

初始化MD5上下文结构

int MD5_Update(MD5_CTX *c, const void *data, size_t len);

刷新MD5,将文件连续数据分片放入进行MD5刷新。

int MD5_Final(unsigned char *md, MD5_CTX *c);

产生最终的MD5数据

unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);

直接产生字符串的MD5

BASE 64

编程所需API

EVP_EncodeInit

编码前初始化上下文。

EVP_EncodeUpdate

进行BASE64编码,本函数可多次调用。

EVP_EncodeFinal

进行BASE64编码,并输出结果

EVP_EncodeBlock

进行BASE64编码。

解码函数

EVP_DecodeInit

解码前初始化上下文。

EVP_DecodeUpdate

BASE64解码,本函数可多次调用。

EVP_DecodeFinal

BASE64解码,并输出结果。

EVP_DecodeBlock

BASE64解码,可单独调用。

引用#include <openssl/evp.h>

网络互传

想要建立网络连接互传文件需要先建立起有效的连接,之后运用之前的对称加密算法对文件进行加密

如何用有效的方法进行加密在之前已经提及了,接下来讲解如何建立有效的网络连接

首先需要引用三个头文件: ssl.h bio.h err.h 他们都在openssl 的子目录中

list_test:

/* OpenSSL headers */ #include "openssl/bio.h" #include "openssl/ssl.h" #include "openssl/err.h" /* Initializing OpenSSL */ SSL_load_error_strings(); ERR_load_BIO_strings(); OpenSSL_add_all_algorithms();

之后建立非安全连接,不管链接的安全与否,openssl都需要一个BIO的抽象库来处理包括文件和套接字在内的各种通信,如果想变的更加安全可以增加各种主流的加密解密协议再进行传输。

BIO指针 BIO * bio;

之后打开连接:创建新的连接需要BIO_new_connect函数,(可以在同一个调用中指明主机和端口号,也可以拆开单独调用)

list_test:

bio = BIO_new_connect("hostname:port"); if(bio == NULL) { /* Handle the failure */ } if(BIO_do_connect(bio) <= 0) { /* Handle failed connection */ }

之后进行与服务器的通信:

不管你套接字还是文件,读和写都可以通过BIO_readBIO_write这两个函数来实现。(受阻塞时返回值为0,返回值为-1表示出现了错误,可以调用BIO_should_retry 来检查是否出现重复错误)

list_list:

int x = BIO_read(bio, buf, len); if(x == 0) { /* Handle closed connection */ } else if(x < 0) { if(! BIO_should_retry(bio)) { /* Handle failed read here */ } /* Do something to handle the retry */ }

if(BIO_write(bio, buf, len) <= 0) { if(! BIO_should_retry(bio)) { /* Handle failed write here */ } /* Do something to handle the retry */ }

read&write函数会尝试写入套接字或者函数

最后进行关闭连接:运用两个函数BIO_reset BIO_free_all 来进行,前者关闭连接并重新设置BIO对象内部状态,以便可以重新连接,后者释放内部结构体并且释放相关的内存包括其中的套接字和文件。

list_test:

BIO_reset(bio); BIO_free_all(bio);

建立安全的连接:

首先设置SSL指针SSL_CTX * ctx = SSL_CTX_new(SSLv23_client_method());

SSL * ssl;

之后加载可信任的证书库(位于certs中),新建.pem格式文件的命令见前文在当前目录下建立公私钥。

if(! SSL_CTX_load_verify_locations(ctx, "/path/to/TrustStore.pem", NULL)) { /* Handle failed load here */ }

之后建立连接后同上文建立非安全的连接之后SSL_CTX_free(ctx);清除ssl的上下文。

最后来理解一下最后一个库err.h的作用,用来检测和打印输出错错误。

1.从栈中检索错误

ERR_reason_error_string

返回一个静态字符串的指针,然后可以将字符串显示在屏幕上、写入文件,或者以任何您希望的方式进行处理

ERR_lib_error_string

指出错误发生在哪个库中

ERR_func_error_string

返回导致错误的 OpenSSL 函数

2.打印出最后一个错误

printf("Error: %s\n", ERR_reason_error_string(ERR_get_error()));

  1. 获得预先格式化的错误字符串
  2. printf("%s\n", ERR_error_string(ERR_get_error(), NULL));

  3. 转储错误队列

ERR_print_errors_fp(FILE *);

ERR_print_errors(BIO *);

OK可以开始编程了!

openssl_final学习总结的更多相关文章

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  3. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  4. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Unity3d学习 制作地形

    这周学习了如何在unity中制作地形,就是在一个Terrain的对象上盖几座小山,在山底种几棵树,那就讲一下如何完成上述内容. 1.在新键得项目的游戏的Hierarchy目录中新键一个Terrain对 ...

  7. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  8. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  9. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

随机推荐

  1. Effective Java 60 Favor the use of standard exceptions

    Benefits to reuse preexisting exceptions It makes your API easier to learn and use. Programs using y ...

  2. nodejs 安装及部署遇到的问题

    Error: ENOENT, stat 'C:\Users\PC_Name\AppData\Roaming\npm PC_Name是机器名 解决方法:在Roaming文件夹下创建一个叫npm的空文件夹 ...

  3. CSS纯样式实现箭头、对话框等形状

    在使用第三方框架bootstrap的时候,本以为其是图片实现的小箭头,后来使用开发工具查看是用CSS来实现的,现记录如下: 之前都没仔细去观注过其原理,都是拿来使用,在实现小箭头之前需要了解下CSS的 ...

  4. find命令中参数perm的用法

    按照文件权限模式用-perm选项,按文件权限模式来查找文件的话.最好使用八进制的权限表示法.如在当前目录下查找文件权限位为755的文件,即文件属主可以读.写.执行,其他用户可以读.执行的文件,可以用: ...

  5. bat文件重启SQL服务和IIS服务

    sqlserver有自动备份功能,所以要重启两个服务器,下面是重启脚本,脚本名称:sql_restart.bat    net stop sqlserveragent net stop mssqlse ...

  6. 动手学习TCP:数据传输

    前面的文章介绍了TCP状态变迁,以及TCP状态变迁图中的一些特殊状态. 本文主要看看TCP数据传输过程中需要了解的一些重要点: MSS(Maximum Segment Size) Seq号和Ack号的 ...

  7. [转]Ionic + AngularJS angular-translate 国际化本地化解决方案

    本文转自:http://www.cnblogs.com/maoyazhi/p/4332362.html 欢迎访问我们的网站,网站上有更多关于技术性的交流:http://www.ncloud.hk/技术 ...

  8. Java实现事件机制

    java中的事件机制的参与者有3种角色: 1.event object:事件状态对象,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中 2.event sourc ...

  9. Selenium2怎么调用selenium1中方法

    虽然selenium1.0已经成为过去时,现在都用selenium2.0,但是如果想要在代码中调用selenium1.0的api怎么办,看下面 WebDriver driver = new Chrom ...

  10. A*算法详解 BZOJ 1085骑士精神

    转载1:A*算法入门 http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算 ...