openssl原始碼結構
Openssl整個軟體包主要包括三個主要的功能模組:密碼演算法庫,SSL協議庫,應用程式;
應用程式:主要包括金鑰生成,證書管理,格式轉換,資料加密,簽名,SSL測試等。
evp,對稱演算法,非對稱演算法,摘要演算法的封裝。
隨機數的生成,管理;
最基本的資料結構,struct 大數陣列, EC_point 橢圓曲線點結構,
openssl編譯的命令:
./config (之後需要加一些全域性性的選型,--openssldir=OPENSSLDIR安裝目錄),預設是usr/local/ssl
--prefix,設定lib,include,bin的目錄。
shared,生成動態連結庫,
演算法選項,no-des,no-ec等,選擇是否編譯某種演算法。
make
make install
openssl中的簽名檔案:
X509,通常是指滿足X.509 V3的一個數字檔案,標準RFC5280。
X509是最基本的證書格式,規範。PKCS標準是具體的針對不同應用場景的封裝格式,是基於x509的。
X509檔案的編碼常用的有兩種,DER:二進位制的檔案編碼,不可讀。
PEM:ASCII Base64編碼的檔案。
X509檔案的三種擴充套件,crt,一般linux用的較多的證書後綴,內部編碼不限,其中包含公鑰,不含私鑰。
cer,一般window下用的較多的證書後綴,內部編碼不限,其中包含公鑰,不含私鑰。
.key格式擴充套件,一般用在PKCS#8中。
crt的擴充套件格式和cer的擴充套件格式,可以相互轉換格式,但是內部的編碼必須相同。(DER對應DER,PEM對應PEM)。
DER的編碼是基於ASN1的語言標準的,編碼之後,類似於二進位制的bin檔案。(ASN1是語言編碼標準,DER是具體的編碼實現)。
檢視PEM編碼的證書:
openssl x509 -in cert.pem -text -noout
openssl x509 -in cert.crt -text -noout
openssl x509 -in cert.cer -text -noout
檢視DER編碼的證書:
openssl x509 -in certificate.der -inform der -text -noout
相互格式轉換:
openssl x509 -in cert.crt -outform der -out cert.der
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
base64到二進位制檔案的轉換:
openssl base64 -in file.bin -out file.64
openssl base64 -d -in file.b64 -out file.bin
Openssl使用pem檔案格式儲存證書和金鑰,PEM中除去標記,實質上是Base64編碼的二進位制內容。
生成rsa私鑰的命令:openssl genrsa -out private_rsa.pem 1024
生成rsa公鑰的命令:openssl rsa -in private_rsa.pem -pubout -out public_rsa.pem
genrsa,產生的是一組rsa的金鑰,其中已經包括公鑰,生成公鑰的命令,只是提取出其中的公鑰,編碼為pem格式。
以明文的方式檢視rsa金鑰的各個引數值:openssl rsa -in private_rsa.pem -text -out private.txt
rsa公鑰轉換為PKCS#8格式:pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
生成ecc證書:
openssl ecparam -out EccCA.key -name prime256v1 -genkey
openssl req -key EccCA.key -new -out EccCA.req
openssl X509 -req -in EccCA.req -signkeyEccCA.key -out EccCA.pem
PEM檔案格式:(標準RFC1421-1424)
將一個物件儲存為PEM格式的檔案,1) 資訊轉換為ASCII碼;
2) 使用對稱加密演算法轉換郵件;(可選)
3) 使用base64對郵件進行編碼處理;
4) 如果使用加密演算法,使用頭資訊格式來指定演算法,資料等資訊;
5) 加上頭、尾標註資訊。
pem格式在openssl中的定義以及呼叫函式:
https://blog.csdn.net/liao20081228/article/details/77185513
openssl中的i2d,d2i系列函式,表徵,將internal object轉換為DER型別的編碼,或者將DER型別的編碼轉換為internal型別的object。
TYPE *d2i_TYPE(TYPE **a, unsigned char **pp, long length);
TYPE *d2i_TYPE_bio(BIO *bp, TYPE **a);
TYPE *d2i_TYPE_fp(FILE *bp, TYPE **a);
int i2d_TYPE(TYPE **a, unsigned char **pp);
int i2d_TYPE_bio(BIO *bp, TYPE **a);
int i2d_TYPE_fp(FILE *bp, TYPE **a);
_bio型別,表示資料介面為bio port,_fp型別,表示資料介面為file point。
_bio和_fp型別內部都是呼叫i2d/d2i_type型別。BIO和FP型別都被轉換為char型別。
d2i,i2d型別函式的定義和實現參考:
https://blog.csdn.net/u010129119/article/details/53811622
在X509.pod中可以看到所有支援的D2I/I2D_TYPE型別的函式。
ssl主要通過BIO和EVP的兩種結構,實現安全套接字的協議。BIO主要是實現套接字的封裝;EVP實現對內部演算法的封裝。
BIO:
BIO是封裝了許多型別I/O介面細節的一種應用介面,可以和SSL連線,非加密的網路連線,檔案I/O進行透明的連線。
主要分為兩種,source/sink型別,如socket BIO,file BIO;filter型別,將資料從一個BIO轉換到另一個BIO,轉換代表hash,enc,dec等操作。
各種型別的BIO函式介紹:
https://blog.csdn.net/liao20081228/article/details/77193729
EVP:
evp主要包括:摘要,對稱演算法,非對稱演算法的核心,filter BIO的實現。
所有的engine可以通過呼叫OpenSSL_add_all_algorithms或者自己初始化engine函式指標。
各種函式的詳細介紹:
https://blog.csdn.net/liao20081228/article/details/76285896
基於ssl介面和BIO介面的openssl api呼叫,實現client,server的加解密服務:
https://blog.csdn.net/gx_1983/article/details/47958323
https://blog.csdn.net/howeverpf/article/details/18993945