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签名 |
| |
| |