openssl知識點總結
實踐總結見之前博客:http://www.cnblogs.com/Jclemo/p/6091201.html
簡介
openssl是一個功能豐富且自包含的開源安全工具箱。它提供的主要功能有:SSL協議實現(包括SSLv2、SSLv3和TLSv1)、大量軟算法(對稱/非對稱/摘要)、大數運算、非對稱算法密鑰生成、ASN.1編解碼庫、證書請求(PKCS10)編解碼、數字證書編解碼、CRL編解碼、OCSP協議、數字證書驗證、PKCS7標准實現和PKCS12個人數字證書格式實現等功能。
openssl采用C語言作為開發語言,這使得它具有優秀的跨平台性能。openssl支持Linux、UNIX、windows、Mac等平台
安裝(linux)
1)解壓openssl開發包文件;
2)運行./config
--prefix=/usr/local/openssl (更多選項用./config --help來查看),可用的選項有:no-mdc2、no-cast no-rc2、no-rc5、no-ripemd、no-rc4 no-des 、no-md2、no-md4、no-idea 、no-aes、no-bf、no-err、no-dsa、no-dh、no-ec、no-hw、no-asm、no-krb5、no-dso 、no-threads 、no-zlib、-DOPENSSL_NO_HASH_COMP、-DOPENSSL_NO_ERR、-DOPENSSL_NO_HW 、-DOPENSSL_NO_OCSP、-DOPENSSL_NO_SHA256和-DOPENSSL_NO_SHA512等。去掉不必要的內容可以減少生成庫的大小。 若要生成debug版本的庫和可執行程序加-g或者-g3(openssl中有很多宏,需要調試學習最好加上-g3)。
3)make test
4)make install
完成后,openssl會被安裝到/usr/local/openssl目錄,包括頭文件目錄include、可執行文件目錄bin、man在線幫助、庫目錄lib以及配置文件目錄(ssl)。
想要完成編程需要安裝libdev包,apt-get即可
源代碼
openssl源代碼主要由eay庫、ssl庫、工具源碼、范例源碼以及測試源碼組成。
eay庫是基礎的庫函數,提供了很多功能。源代碼放在crypto目錄下。包括如下內容:
1) asn.1 DER編碼解碼(crypto/asn1目錄),它包含了基本asn1對象的編解碼以及數字證書請求、數字證書、CRL撤銷列表以及PKCS8等最基本的編解碼函數。這些函數主要通過宏來實現。
2) 抽象IO(BIO,crypto/bio目錄),本目錄下的函數對各種輸入輸出進行抽象,包括文件、內存、標准輸入輸出、socket和SSL協議等。
3) 大數運算(crypto/bn目錄),本目錄下的文件實現了各種大數運算。這些大數運算主要用於非對稱算法中密鑰生成以及各種加解密操作。另外還為用戶提供了大量輔助函數,比如內存與大數之間的相互轉換。
4) 字符緩存操作(crypto/buffer目錄)。
5) 配置文件讀取(crypto/conf目錄),openssl主要的配置文件為openssl.cnf。本目錄下的函數實現了對這種格式配置文件的讀取操作。
6) DSO(動態共享對象,crypto/dso目錄),本目錄下的文件主要抽象了各種平台的動態庫加載函數,為用戶提供統一接口。
7) 硬件引擎(crypto/engine目錄),硬件引擎接口。用戶如果要寫自己的硬件引擎,必須實現它所規定的接口。
8) 錯誤處理(crypto/err目錄),當程序出現錯誤時,openssl能以堆棧的形式顯示各個錯誤。本目錄下只有基本的錯誤處理接口,具體的的錯誤信息由各個模塊提供。各個模塊專門用於錯誤處理的文件一般為*_err..c文件。
9) 對稱算法、非對稱算法及摘要算法封裝(crypto/evp目錄)。
10)HMAC(crypto/hmac目錄),實現了基於對稱算法的MAC。
11)hash表(crypto/lhash目錄),實現了散列表數據結構。openssl中很多數據結構都是以散列表來存放的。比如配置信息、ssl session和asn.1對象信息等。
12)數字證書在線認證(crypto/ocsp目錄),實現了ocsp協議的編解碼以及證書有效性計算等功能。
13)PEM文件格式處理(crypto/pem),用於生成和讀取各種PEM格式文件,包括各種密鑰、數字證書請求、數字證書、PKCS7消息和PKCS8消息等。
14)pkcs7消息語法(crypto/pkcs7目錄),主要實現了構造和解析PKCS7消息;
15)pkcs12個人證書格式(crypto/pckcs12目錄),主要實現了pkcs12證書的構造和解析。
16)隊列(crypto/pqueue目錄),實現了隊列數據結構,主要用於DTLS。
17)隨機數(crypto/rand目錄),實現了偽隨機數生成,支持用戶自定義隨機數生成。
18)堆棧(crypto/stack目錄),實現了堆棧數據結構。
19)線程支持(crypto/threads),openssl支持多線程,但是用戶必須實現相關接口。
20)文本數據庫(crypto/txt_db目錄)。
21)x509數字證書(crypto/x509目錄和crypto/x509v3),包括數字證書申請、數字證書和CRL的構造、解析和簽名驗證等功能了;
22)對稱算法(crypto/aes、crypto/bf、crypto/cast、ccrypto/omp和crypto/des等目錄)。
23)非對稱算法(crypto/dh、crypto/dsa、crypto/ec和crypto/ecdh)。
24)摘要算法(crypto/md2、crypto/md4、crypto/md5和crypto/sha)以及密鑰交換/認證算法(crypto/dh 和crypto/krb5)。
命令行下命令集
1.-dgst
dgst用於數據摘要。
用法:
openssl dgst -md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1 ] -c]-d [-binary]
-out filename -passin arg [-prverify
filename]
[-signature
filename ] [file...]
選項:
-d
打印調試信息。
-sign
privatekeyfile
用privatekeyfile中的私鑰簽名。
-verify
publickeyfile
用publickeyfile中的公鑰驗證簽名。
-prverify
privatekeyfile
用privatekeyfile中的私鑰驗證簽名。
-keyform PEM |
ENGINE
密鑰格式,PEM格式或者采用Engine。
-hex
顯示ASCII編碼的十六進制結果,默認選項。
-binary
顯示二進制數據。
-engine
采用引擎e來運算。
-md5
默認選項,用md5進行摘要。
-md4
用md4摘要。
-md2
用md2摘要。
-sha1
用sha1摘要。
-sha
用sha摘要。
-sha256
用-sha256摘要。
-sha512
用sha512摘要。
-mdc2
用mdc2摘要。
-ripemd160
用ripemd160摘要。
示例:
openssl dgst c:\server.pem
運行此命令后文件的md5值摘要結果會在屏幕打印出來,此結果為摘要結果轉換為ASCII碼后的值:
MD5(c:\server.cer)= 4ace36445f5ab4bbcc2b9dd55e2f0e3a
openssl dgst –binary c:\server.pem
結果為二進制亂碼。
openssl dgst –hex –c c:\server.pem
2.genrsa
生成RSA密鑰。
用法:
openssl genrsa
-out filename -des -idea -3
-engine id
選項:
-des
以des cbc模式加密密鑰;
-des3
以3des cbc模式加密密鑰;
-idea
以idea cbc模式加密密鑰;
-aes128, -aes192, -aes256
cbc模式加密密鑰;
-out file
輸出文件;
-f4
指定E為0x1001;
-3
指定E為3;
-engine e
指定engine來生成RSA密鑰;
-rand file
指定隨機數種子文件;
numbits
密鑰長度,如果不指定默認為512。
3.req
req命令主要用於生成和處理PKCS#10證書請求。
用法:
openssl req [-inform PEM|DER]
-outform PEM|DER -passin arg [-passout arg]
-text -noout -modulus [-rand file(s)] [-newkey
rsa:bits] -newkey dsa:file -key filename
-keyout filename] -config filename
-multivalue-rdn -days n -asn1-kludge
-extensions section -utf8 -batch
[-engine id]
選項:
-out
指定輸出文件名。
-outform
DER|PEM
指定輸出格式。
-newkey
rsa:bits
用於生成新的rsa密鑰以及證書請求。如果用戶不知道生成的私鑰文件名稱,默認采用privkey.pem,生成的證書請求。如果用戶不指定輸出文件(-out),則將證書請求文件打印在屏幕上。生成的私鑰文件可以用-keyout來指定。生成過程中需要用戶輸入私鑰的保護口令以及證書申請中的一些信息。
-new
生成新的證書請求以及私鑰,默認為1024比特。
-rand
指定隨機數種子文件,比如有隨機數文件rand.dat,用戶輸入:-rand file:rand.dat。
-config
file
指定證書請求模板文件,默認采用openssl.cnf,需另行指定時用此選項。配置的寫法可以參考openssl.cnf,其中有關於生成證書請求的設置。
-subj
arg
用於指定生成的證書請求的用戶信息,或者處理證書請求時用指定參數替換。生成證書請求時,如果不指定此選項,程序會提示用戶來輸入各個用戶信息,包括國名、組織等信息,如果采用此選擇,則不需要用戶輸入了。比如:-subj /CN=china/OU=test/O=abc/CN=forxy,注意這里等屬性必須大寫。
-multivalue-rdn
當采用-subj arg選項時,允許多值rdn名,比如arg參數寫作:/CN=china/OU=test/O=abc/UID=123456+CN=forxy。
-reqexts ..
設置證書請求的擴展項,被設置的擴展項覆蓋配置文件所指定的擴展項。
-utf8
輸入字符為utf8編碼,默認輸入為ASCII編碼。
-batch
不詢問用戶任何信息(私鑰口令除外),采用此選項生成證書請求時,不詢問證書請求當各種信息。
-noout
不輸出證書請求。
-newhdr
在生成的PME證書請求文件的頭尾添加“NEW”,有些軟件和CA需要此項。
-engine e
指定硬件引擎。
-keyout
指定生成的私鑰文件名稱。
示例:
openssl req –new
openssl req –new –config myconfig.cnf
openssl req –subj /CN=cn/O=test/OU=abc/CN=forxy
openssl req -newkey rsa:1024
openssl req -newkey rsa:1024 -out myreq.pem –keyout
myprivatekey.pem
openssl req
-newkey rsa:1024 -out myreq.pem -keyout myprivatekey.pem -outform DER
-subject
輸出證書請求者信息。
-modulus
輸出證書請求的模數。
示例:openssl req -in
myreq.pem -modulus –subject。
-pubkey
獲取證書請求中的公鑰信息。
示例:
openssl req -in myreq.pem -pubkey -out pubkey.pem
-in
filename
輸入的證書請求文件。
-text
打印證書請求或自簽名證書信息。
-verify
驗證證書請求。
示例:
openssl req -in zcp.pem
-verify
-inform
DER|PEM
指定輸入的格式是DEM還是DER。
-x509
生成自簽名證書。
-extensions
設置證書擴展項,設置的擴展項優先於配置文件指定的擴展項。
-set_serial
設置生成證書的證書序列
-[md5|md4|md2|sha1|mdc2]
生成自簽名證書時,指定摘要算法。
-passin
用戶將私鑰的保護口令寫入一個文件,采用此選項指定此文件,可以免去用戶輸入口令的操作。比如用戶將口令寫入文件“pwd.txt”,輸入的參數為:-passin file:pwd.txt。
-days
指定自簽名證書的有效期限。
示例:
openssl req -in myreq.pem -x509 -key myprivatekey.pem -out mycert.pem
openssl req -in myreq.pem -x509 -key myprivatekey.pem -out mycert.pem
-days 300
openssl req -in myreq.pem -x509 -key myprivatekey.pem -out mycert.pem
-days 300 -text
openssl req -in myreq.pem -x509 -key myprivatekey.pem -out mycert.pem
-days 300 -text
-md5
openssl req -in myreq.pem -x509 -key myprivatekey.pem -out mycert.pem
-days 300 -text -md5
–set_serial 0x100
openssl req -in myreq.pem -x509 -key myprivatekey.pem -out mycert.pem
-days 300 -text -md5 –passin
file:pwd.txt
這里的myreq.pem為PEM格式的文件,可以用-inform指定其格式。
-out filename
要輸出的文件名。
-text
將CSR文件里的內容以可讀方式打印出來。
-noout
不要打印CSR文件的編碼版本信息。
-modulus
將CSR里面的包含的公共米要的系數打印出來。
-verify
檢驗請求文件里的簽名信息。
4.x509
X509命令是一個多用途的證書工具。它可以顯示證書信息、轉換證書格式、簽名證書請求以及改變證書的信任設置等。
用法:
openssl x509
-inform DER|PEM|NET [-keyform DER|PEM] [-CAform
DER|PEM] -CAkeyform DER|PEM -out filename [-hash]
-subject_hash -subject -nameopt option
-startdate -purpose -modulus [-alias]
-noout -clrtrust -addtrust arg
-setalias arg -set_serial n [-x509toreq]
-req -CAkey filename [-CAserial filename]
-text -md2|-md5|-sha1|-mdc2 [-extfile filename] [-extensions
section] [-engine id]
選項:
-inform
DER|PEM|NET
指定輸入文件的格式,默認為PEM格式。
-outform
DER|PEM|NET
指定輸出文件格式,默認為PEM格式。
-keyform
指定私鑰文件格式,默認為PEM格式。
-CAform
指定CA文件格式,默認為PEM格式。
-CAkeyform
指定CA私鑰文件格式,默認為PEM格式。
-in
filename
指定輸入文件名。
-out filename
指定輸出文件名。
-passin
指定私鑰保護密鑰來源,參考req說明,比如:-passin file:pwd.txt。
-serial
顯示證書的序列號。
-subject_hash
顯示持有者的摘要值。
-issuer_hash
顯示頒發者的摘要值。
-hash
顯示證書持有者的摘要值,同-subject_hash。
-subject
顯示證書持有者DN。
-issuer
顯示證書頒發者DN。
顯示email地址。
-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
根據證書來生成證書請求,需要指定簽名私鑰,如:
openssl x509 -in ca.pem -x509toreq -signkey key.pem
-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顯示時,設置是否打印哪些內容,arg可用是:compatible、no_header、no_version、no_extensions和ext_parse等等
5.rsa
Rsa命令用於處理RSA密鑰、格式轉換和打印信息。
用法:
openssl rsa -inform PEM|NET|DER [-in
filename] -passin arg -passout arg -des
-idea -noout -check [-pubout] [-engine id]
選項:
-inform
DER|PEM|NET
指定輸入的格式,NET格式是與老的Netscape服務以及微軟的IIS兼容的一種不太安全的格式。
-outform
DER|PEM|NET
指定輸出格式。
-in filename
輸入文件名。
-passin arg
私鑰保護密鑰來源,比如:-passin
file:pwd.txt。
-out filename
輸出的文件名。
-des|-des3|-idea
指定私鑰保護加密算法。
-text
打印密鑰信息。
-noout
不打印任何信息。
-modulus
打印密鑰模數。
-pubin
表明輸入文件為公鑰,默認的輸入文件是私鑰。
-pubout
表明輸出文件為公鑰。
-check
檢查RSA私鑰。
-engine id
指明硬件引擎。
示例:
生成明文私鑰文件:
openssl genrsa -out key.pem
轉換為DER編碼:
openssl rsa -in key.pem -outform der -out key.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
顯示私鑰信息,保護密鑰寫在pwd.txt中
openssl rsa -in enckey.pem –passin
通過以上指令能完成hash、md5、sha1、ca|x509證書等多種初級命令行指令
編程
base64:
BASE64編碼是一種常用的將十六進制數據轉換為可見字符的編碼。與ASCII碼相比,它占用的空間較小。BASE64編碼在rfc3548中定義
主要api
Openssl中用於base64編解碼的函數主要有:
1) 編碼函數
Ø EVP_EncodeInit
編碼前初始化上下文。
Ø EVP_EncodeUpdate
進行BASE64編碼,本函數可多次調用。
Ø EVP_EncodeFinal
進行BASE64編碼,並輸出結果。
Ø EVP_EncodeBlock
進行BASE64編碼。
2)解碼函數
Ø EVP_DecodeInit
解碼前初始化上下文。
Ø EVP_DecodeUpdate
BASE64解碼,本函數可多次調用。
Ø EVP_DecodeFinal
BASE64解碼,並輸出結果。
Ø EVP_DecodeBlock
RSA:
RSA算法是一個廣泛使用的公鑰算法。其密鑰包括公鑰和私鑰。它能用於數字簽名、身份認證以及密鑰交換。RSA密鑰長度一般使用1024位或者更高。RSA密鑰信息主要包括[1]:
Ø n:模數
Ø e:公鑰指數
Ø d:私鑰指數
Ø p:最初的大素數
Ø q:最初的大素數
Ø dmp1:e*dmp1 = 1 (mod (p-1))
Ø dmq1:e*dmq1 = 1 (mod (q-1))
Ø iqmp:q*iqmp = 1 (mod p )
其中,公鑰為n和e;私鑰為n和d。在實際應用中,公鑰加密一般用來協商密鑰;私鑰加密一般用來簽名。
Openssl的RSA實現源碼在crypto/rsa目錄下。它實現了RSA PKCS1標准。主要源碼如下:
1) rsa.h
定義RSA數據結構以及RSA_METHOD,定義了RSA的各種函數。
2) rsa_asn1.c
實現了RSA密鑰的DER編碼和解碼,包括公鑰和私鑰。
3) rsa_chk.c
RSA密鑰檢查。
4) rsa_eay.c
Openssl實現的一種RSA_METHOD,作為其默認的一種RSA計算實現方式。此文件未實現rsa_sign、rsa_verify和rsa_keygen回調函數。
5)rsa_err.c
RSA錯誤處理。
6)rsa_gen.c
RSA密鑰生成,如果RSA_METHOD中的rsa_keygen回調函數不為空,則調用它,否則調用其內部實現。
主要實現了RSA運算的四個函數(公鑰/私鑰,加密/解密),它們都調用了RSA_METHOD中相應都回調函數。
8)rsa_none.c
實現了一種填充和去填充。
9)rsa_null.c
實現了一種空的RSA_METHOD。
10) rsa_oaep.c
實現了oaep填充與去填充。
11)rsa_pk1.c
實現了pkcs1填充與去填充。
12)rsa_sign.c
實現了RSA的簽名和驗簽。
13)rsa_ssl.c
實現了ssl填充。
14)rsa_x931.c
實現了一種填充和去填充。
重要api:
1) RSA_check_key
檢查RSA密鑰。
2)RSA_new
生成一個RSA密鑰結構,並采用默認的rsa_pkcs1_eay_meth RSA_METHOD方法。
3)RSA_free
釋放RSA結構。
4)RSA
*RSA_generate_key(int bits, unsigned long e_value,
void (*callback)(int,int,void *), void *cb_arg)
生成RSA密鑰,bits是模數比特數,e_value是公鑰指數e,callback回調函數由用戶實現,用於干預密鑰生成過程中的一些運算,可為空。
5)RSA_get_default_method
獲取默認的RSA_METHOD,為rsa_pkcs1_eay_meth。
6)RSA_get_ex_data
獲取擴展數據。
7)RSA_get_method
獲取RSA結構的RSA_METHOD。
8)RSA_padding_add_none
RSA_padding_add_PKCS1_OAEP
RSA_padding_add_PKCS1type1(私鑰加密的填充)
RSA_padding_add_PKCS1type2(公鑰加密的填充)
RSA_padding_add_SSLv23
各種填充方式函數。
9)RSA_padding_check_none
RSA_padding_check_PKCS1_OAEP
RSA_padding_check_PKCS1type1
RSA_padding_check_PKCS1type2
RSA_padding_check_SSLv23
RSA_PKCS1_SSLeay
各種去除填充函數。
10)int RSA_print(BIO *bp, const RSA *x, int off)
將RSA信息輸出到BIO中,off為輸出信息在BIO中的偏移量,比如是屏幕BIO,則表示打印信息的位置離左邊屏幕邊緣的距離。
11)int DSA_print_fp(FILE *fp, const DSA *x, int off)
將RSA信息輸出到FILE中,off為輸出偏移量。
12)RSA_public_decrypt
RSA公鑰解密。
13)RSA_public_encrypt
RSA公鑰加密。
14)RSA_set_default_method/ RSA_set_method
設置RSA結構中的method,當用戶實現了一個RSA_METHOD時,調用此函數來設置,使RSA運算采用用戶的方法。
15)RSA_set_ex_data
設置擴展數據。
16)RSA_sign
RSA簽名。
17)RSA_sign_ASN1_OCTET_STRING
另外一種RSA簽名,不涉及摘要算法,它將輸入數據作為ASN1_OCTET_STRING進行DER編碼,然后直接調用RSA_private_encrypt進行計算。
18)RSA_size
獲取RSA密鑰長度字節數。
19)RSA_up_ref
給RSA密鑰增加一個引用。
20)RSA_verify
RSA驗證。
21)RSA_verify_ASN1_OCTET_STRING
另一種RSA驗證,不涉及摘要算法,與RSA_sign_ASN1_OCTET_STRING對應。
22)RSAPrivateKey_asn1_meth
獲取RSA私鑰的ASN1_METHOD,包括i2d、d2i、new和free函數地址。
23)RSAPrivateKey_dup
復制RSA私鑰。
24)RSAPublicKey_dup
復制RSA公鑰。
x509證書申請:
數字證書是將用戶(或其他實體)身份與公鑰綁定的信息載體。一個合法的數字證書不僅要符合X509格式規范,還必須有CA的簽名。用戶不僅有自己的數字證書,還必須有對應的私鑰。
X509v3數字證書主要包含的內容有:證書版本、證書序列號、簽名算法、頒發者信息、有效時間、持有者信息、公鑰信息、頒發者ID、持有者ID和擴展項。
數據結構:
根據PKCS#10,openssl的X509數字證書申請結構定義在crypto/x509.h中,如下所示,主要由兩部分組成:
1)X509_REQ_INFO
typedef struct X509_req_info_st
{
ASN1_ENCODING enc;
ASN1_INTEGER *version;
X509_NAME *subject;
X509_PUBKEY *pubkey;
STACK_OF(X509_ATTRIBUTE) *attributes;
}
X509_REQ_INFO;
該結構為證書申請信息主體,其中version表示版本,subject為申請者信息,pubkey為申請者公鑰信息,attributes為可選的屬性信息。該結構的DER編碼接口在crytpo/asn1/x_req.c中由宏實現,實現了new、free、i2d和d2i函數。
2)X509_REQ
typedef struct X509_req_st
{
X509_REQ_INFO *req_info;
X509_ALGOR *sig_alg;
ASN1_BIT_STRING *signature;
int references;
}
X509_REQ;
該結構為證書申請信息,req_info為信息主體,sig_alg為簽名算法,signature為簽名值(申請者對req_info的DER編碼值用自己的私鑰簽名)。該結構的DER編碼接口在crytpo/asn1/x_req.c中由宏實現,實現了new、free、i2d和d2i函數。
主要api:
1)int X509REQ_add1attr(X509REQ *req, X509ATTRIBUTE *attr)
添加一個屬性到req的屬性堆棧中。
2)int X509REQ_add1attr_by_NID(X509_REQ *req,int nid, int type,const unsigned char *bytes, int len)
添加一個屬性到req的屬性堆棧中,nid指明了屬性類型,bytes為屬性值,len為其長度,type為屬性值的ASN1類型。
3)
X509REQ_add1attr_by_OBJ
同上,屬性類型由ASN1_OBJECT指定。
4)
X509REQ_add1attr_by_txt
同上,屬性類型由屬性名指定。
5)int X509_REQ_add_extensions_nid(X509REQ *req, STACK_OF(X509EXTENSION) *exts,int nid)
添加一個屬性到req的屬性堆棧中,將exts擴展項集合作為一個屬性加入,nid指明了加入的是哪種屬性;該函數將X509_EXTENSION堆棧DER編碼,編碼后的值作為屬性值。
6)X509_REQ_add_extensions
調用了5),只是nid指定為NID_ext_req。
7)X509_REQ_delete_attr
從屬性堆棧中刪除指定位置的屬性。
8) X509_REQ_digest
根據指定的摘要算法,對X509_REQ結構做摘要計算。
9) X509_REQ_dup
拷貝函數,返回一個X509REQ,返回的X509REQ需要調用X509_REQ_free釋放空間。
10)int X509_REQ_extension_nid(int req_nid)
判斷req_nid是否為NID_ext_req、NID_ms_ext_req或其他由用戶設置的NID,如果是返回1,否則返回0。
11)STACK_OF(X509_EXTENSION) *X509REQ_get_extensions(X509REQ *req)
獲取X509REQ中的屬性信息,並將屬性信息轉換為X509EXTENSION堆棧。該函數從X509REQ的屬性堆棧中查找包含合法的nid類型的屬性(見X509REQ_get_extension_nids函數說明),如果找到一個,則將屬性值通過DER解碼轉換為擴展項堆棧。
12)X509REQ_get1email
獲取證書申請中申請者的郵件地址信息,信息來自X509_NAME *subject和STACK_OF(X509_ATTRIBUTE) *attributes,返回一個堆棧。
13)X509_REQ_get_attr
根據指定位置,獲取屬性堆棧中的一個屬性。
14)int X509REQ_get_attr_by_NID(const X509REQ *req, int nid, int lastpos)
根據屬性nid,從req的屬性堆棧中查找對應屬性,並返回。查找堆棧時,從lastpos位置開始查找。
15)X509_REQ_get_attr_by_OBJ
同上,根據ASN1_OBJECT來查找屬性。
16)X509_REQ_get_attr_count
屬性堆棧中屬性的個數。
17)X509_REQ_get_extension_nids/X509_REQ_set_extension_nids
獲取證書申請合法擴展項列表,默認情況下,該列表在x509/x509_req.c中定義如下:
static int
ext_nid_list[] = { NID_ext_req, NID_ms_ext_req, NID_undef};
static int
*ext_nids = ext_nid_list;
本函數返回ext_nids;
通過X509REQ_set_extension_nids函數,用戶可用定義自己的證書申請擴展項列,該函數的輸入參數是一個nid列表。調用X509REQ_set_extension_nids時,將ext_nids修改為用戶輸入參數,不再是默認的ext_nid_list。
18)X509_REQ_get_pubkey
獲取公鑰。
19)X509_REQ_print
將證書申請信息輸出到BIO中。
20)int X509_REQ_print_ex(BIO *bp, X509_REQ *x,unsigned long nmflags, unsigned long cflag)
將證書申請信息輸出到BIO中,輸出的內容通過cflag進行過濾,其值定義在x509.h中,如下:
define X509_FLAG_NO_HEADER 1L
define X509_FLAG_NO_VERSION (1L << 1)
define X509_FLAG_NO_SERIAL (1L << 2)
define X509_FLAG_NO_SIGNAME (1L << 3)
define X509_FLAG_NO_ISSUER (1L << 4)
define X509_FLAG_NO_VALIDITY (1L << 5)
define X509_FLAG_NO_SUBJECT (1L << 6)
define X509_FLAG_NO_PUBKEY (1L << 7)
define X509_FLAG_NO_EXTENSIONS (1L << 8)
define X509_FLAG_NO_SIGDUMP (1L << 9)
define X509_FLAG_NO_AUX (1L << 10)
define X509_FLAG_NO_ATTRIBUTES (1L << 11)
21)X509_REQ_print_fp
將證書申請消息輸出到FILE中。
22)X509REQ *X509to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
根據證書信息,申請者私鑰以及摘要算法生成證書請求。x為數字證書,pkey為申請人的私鑰信息,md為摘要算法,pkey和md用於給證書申請簽名。
23)X509
*X509REQ_to_X509(X509REQ *r, int days,EVP_PKEY *pkey)
根據X509REQ生成一個數字證書並返回,days指明其失效期,pkey為外送私鑰,用於簽名,返回數字證書。此函數無多大用處,由於沒有指明頒發者,生成的數字證書頒發者就是X509REQ中的申請人,並且證書的摘要固定用的是md5算法,另外,沒有處理證書擴展項。
24)int X509REQ_set_pubkey(X509REQ *x, EVP_PKEY *pkey)
設置證書請求的公鑰。
25)int X509REQ_set_subject_name(X509REQ *x, X509_NAME *name)
設置證書請求的者的名稱,此函數調用X509_NAME_set函數來實現。
26)int X509REQ_set_version(X509REQ *x, long version)
設置證書請求信息的版本,此函數調用ASN1_INTEGER_set函數來完成。
實踐詳情見本博客中置頂鏈接