openssl知識點總結


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

顯示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函數來完成。

實踐詳情見本博客中置頂鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM