openssl知识点总结html
openssl实践总结linux
openssl是一个功能丰富且自包含的开源安全工具箱。它提供的主要功能有:
SSL协议实现(包括SSLv二、SSLv3和TLSv1)、大量软算法(对称/非对称/摘要)、大数运算、非对称算法密钥生成、ASN.1编解码库、证书请求(PKCS10)编解码、数字证书编解码、CRL编解码、OCSP协议、数字证书验证、PKCS7标准实现和PKCS12我的数字证书格式实现等功能。算法
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
完成添加头文件ide
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
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结构作摘要。
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
编程所需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_read
和 BIO_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()));
printf("%s\n", ERR_error_string(ERR_get_error(), NULL));
转储错误队列
ERR_print_errors_fp(FILE *);
ERR_print_errors(BIO *);
OK能够开始编程了!