openssl_final學習總結

openssl學習總結

openssl知識點總結html

openssl實踐總結linux

簡介

openssl是一個功能豐富且自包含的開源安全工具箱。它提供的主要功能有:
SSL協議實現(包括SSLv二、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完成添加頭文件ide

協議下的應用

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能夠開始編程了!

相關文章
相關標籤/搜索