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