27.openssl編程——OCSP


27.1 概述
在線證書狀態協議(OCSP, Online Certificate Status Protocol,rfc2560)用於實時表明證書狀態。OCSP客戶端通過查詢OCSP服務來確定一個證書的狀態。OCSP可以通過HTTP協議來實現。
27.2 Openssl實現
openssl在crypto/ocsp目錄實現了ocsp模塊,包括客戶端和服務端各種函數
*ocsp_asn.c :ocsp消息的DER編解碼實現,包括基本的new\free\i2d和d2i函數
*ocsp_cl.c:ocsp客戶端函數實現,主要用於生成ocsp請求
*ocsp_srv.c:ocsp服務端思想,主要用於生成ocsp響應
*ocsp_err.c:oscp錯誤處理
*ocsp_ext.c:ocsp擴展項處理
*ocsp_ht.c:基於HTTP協議通信的OCSP實現
*ocsp_lib.c:通用庫實現
*ocsp_prn :打印OCSP信息
*ocsp_vfy: 驗證ocsp請求和響應
ocsp.h:定義ocsp請求和響應的各種數據結構和用戶接口。
27.3 主要函數
功能
函數
d2i_OCSP_REQUEST_bio
將bio中的DER編碼的數據轉換為OCSP_REQUEST數據結構
d2i_OCSP_RESPONSE_bio
將bio中DER編碼的數據轉換為OCSP_RESPONSE數據結構
i2d_OCSP_RESPONES_bio
將OCSP_RESPONSE數據結構DER編碼,並輸出到BIO中
i2d_OCSP_REQUEST_bio
將OCSP_REQUEST數據結構DER編碼,並輸出到BIO中
PEM_read_bio_OCSP_REQUEST
讀取PEM格式的OCSP_REQUESET信息,返回數據結構
PEM_read_bio_OCSP_RESPONSE
讀取PEM格式的OCSP_RESPONSE信息,返回其數據結構
PEM_write_bio_OCSP_RESPONE
將OCSP_REQUEST結構寫成PEM格式
PEM_write_bio_OCSP_REQUEST
將OCSP_REQUEST結構寫成PEM格式
OCSP_REQUEST_sign
本函數由空來定義,他用於給OCSP_REQUEST數據結構簽名。 簽名的對象為DER編碼的OCSP_REQINFO信息
OCSP_request_sign
本函數用於給OCSPQ請求消息簽名
OCSP_BASICRESP_sign
對OCSP_BASICRESP結構進行簽名,
簽名的結構放在OCSP_BASICRESP的signature中,
摘要算法由輸入參數指定
OCSP_REQUEST_verify
驗證ocsp請求簽名,公鑰由公鑰由輸入參數指定
OCSP_request_verify
驗證ocsp響應,該函數做全面的驗證,
包括簽名、證書目的以及證書鏈等
OCSP_basic_sign
並對brsp結構簽名
OCSP_check_validity
時間檢查計算,合法返回1,thisupd為本次更新時間,
nextupd為下次更新時間
OCSP_CERTID_dup
復制函數
OCSP_CERTSTATUS_dup
復制函數
OCSP_request_add0_id
本函數用於往請求消息中添加一個證書ID;
他將一個OCSP_CERTID信息存入OCSP_REQUEST結構,
返回內部生成的OCSP_ONEREQ指針
OCSP_request_set1_name
本函數用於設置下消息請求者的名字
OCSP_request_add1_cert
本函數往消息請求中添加一個證書
OCSP_response_status
本函數獲取OCSP相應狀態
OCSP_reponse_get1_basic
本函數從響應數據結構中獲取OCSP_BASICERESP信息
OCSP_resp_count
本函數獲取相應消息中包含的證書狀態個數
OCSP_resp_get0
給定單個響應的序號,從堆棧中取出
OCSP_resp_find
根據ocsp證書ID查詢對應的響應在堆棧中的位置,
last為所搜堆棧起始位置
OCSP_single_get0_status
獲取單個證書狀態,返回值為其狀態,ocsp.h中定義
OCSP_resp_find_status
功能同OCSP_single_get0_status函數
OCSP_request_add1_nonce
添加nonce擴展項,val和len表明了nonce值
OCSP_check_nonce
檢測nonce,用於防止重放攻擊;
檢查請求和響應的nonce擴展項,看他們是否相同;
OCSP_copy_nonce
將請求中都nonce拷貝到響應中
OCSP_crlID_new
根據crl的url,crl個數以及生成clr的時間生成X509_EXTENSION擴展項
OCSP_accept_response_new
根據多個oid的名字生成擴展項,其中oids指針數組,以NULL結尾。
OCSP_archive_cutoff_new
生成單個證書的Archive Cutoff擴展項
OCSP_url_svcloc_new
根據頒發這名字和一個或多個ul生成擴展項。擴展項內容為AuthorityInfoAccess。
OCSP_cert_to_id
根據摘要算法、持有者證書和頒發這證書生成OCSP_CERTIF數據結構
OCSP_cert_id_new
本函數根據摘要算法\頒發者名字、頒發這公鑰DER編碼以及證書持有者的證書序列好生成OCSP_CERTID;
奇怪的是serialNumber可以為空,無法識別需要鏟鱘狀態證書
OCSP_id_issuer_cmp
比較OCSP_CERTID,如果相等返回0,不想等返回ifei0
OCSP_id_cmp
比較OCSP_CERTID,本函數比較所有項,包括證書序列號
OCSP_parse_url
分析url,獲取主機、端口、路徑和協議等信息
OCSP_response_status_strl
根據OCSP相應碼獲取相應狀態信息
OCSP_cert_status_str
根據證書狀態嗎獲取證書狀態信息
OCSP_REQUEST_print
將OCSP請求OCSP_REQUEST的信息輸出到bp中,flags表明不支持擴展項
OCSP_RESPONSE_print
將OCSP請求OCSP_RESPONSE的信息輸出到bp中,flags表明不支持到擴展項導出方式。
OCSP_request_onereq_get0
根據在堆棧中的位置獲取OCSP_ONEREQ,OCSP_ONEREQ包含了單個證書信息
OCSP_onereq_get0_id
獲取OCSP_ONEREQ中的證書ID信息
OCSP_id_get_info
從cid中獲取頒發這名字摘要值、摘要算法、頒發這公鑰摘要值以及持有者證書序列號
OCSP_request_is_signed
判斷請求是否已簽名,如果已簽名
OCSP_basic_add1_status
根據輸入參數證書ID、證書狀態、撤銷原因、撤銷時間
ASN1_STRING_encode
本函數將數據進行DER編碼,編碼后的結果放在ASN1_STRING中,
兵返回ASN1_STRING.
OCSP_REQUEST_get_ext_by_NID
根據對象nid獲取擴展項
OCSP_REQUEST_get_ext_by_OBJ
獲取對象在x->tbsRequest->requestExtension中的位置
OCSP_REQUEST_get_ext
根據擴展項在堆棧中的位置獲取擴展項
OCSP_REQUEST_get1_ext_d2i
根據擴展項nid獲取擴展項信息,其中返回值為擴展項數據結構的指針地址,
crit返回是否時關鍵擴展,idx表明他在堆棧中的位置
OCSP_REQUEST_add_ext_i2d
將具體的擴展項添加到x中,成功則返回1。
OCSP_REQUEST_add_ext
將擴展項添加到堆棧中,loc表示堆棧位置
OCSP_basic_vverify
驗證OCSP響應消息,成功返回1。驗證內容有:驗證OCSP簽名、
驗證OCSP簽名者證書、檢查每個證書狀態信息的頒發者是否相同、
檢查頒發者證書的擴展密鑰用法中是否支持OCSP簽名


免責聲明!

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



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