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签名
posted @ 2018-01-25 17:09  艾小小雨  阅读(2448)  评论(0编辑  收藏  举报