zoukankan      html  css  js  c++  java
  • openssl_final学习总结

    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中。

    1. X509_STORE_add_crl

    将crl添加到X509_STORE中。

    1. 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

    证书比较。

    1. 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。

    1. 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 ", ERR_reason_error_string(ERR_get_error()));

    1. 获得预先格式化的错误字符串

    printf("%s ", ERR_error_string(ERR_get_error(), NULL));

    1. 转储错误队列

    ERR_print_errors_fp(FILE *);

    ERR_print_errors(BIO *);

    OK可以开始编程了!

  • 相关阅读:
    第一模块第一章 review
    python练习题:三级菜单
    python list()总结
    python中index()、find()方法
    python中join()函数、list()函数补充的用法
    python中关键字的总结
    python中for循环的用法
    python中range()、list()函数的用法
    python中pop()函数的用法
    python中split()、os.path.split()函数用法
  • 原文地址:https://www.cnblogs.com/Jclemo/p/6219613.html
Copyright © 2011-2022 走看看