第二十五章 证书申请 / 25.3 主要函数

1  int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr)

       添加一个属性到req的属性堆栈中。

1)  int X509_REQ_add1_attr_by_NID(X509_REQ *req,int nid,

int type,const unsigned char *bytes, int len)

添加一个属性到req的属性堆栈中,nid指明了属性类型,bytes为属性值,len为其长度,type为属性值的ASN1类型。

       3  X509_REQ_add1_attr_by_OBJ

              同上,属性类型由ASN1_OBJECT指定。

       4  X509_REQ_add1_attr_by_txt

              同上,属性类型由属性名指定。

4)  int X509_REQ_add_extensions_nid(

X509_REQ *req, STACK_OF(X509_EXTENSION) *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

拷贝函数,返回一个X509_REQ,返回的X509_REQ需要调用X509_REQ_free释放空间。

10int X509_REQ_extension_nid(int req_nid)

判断req_nid是否为NID_ext_reqNID_ms_ext_req或其他由用户设置的NID,如果是返回1,否则返回0

11STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req)  

获取X509_REQ中的属性信息,并将属性信息转换为X509_EXTENSION堆栈。该函数从X509_REQ的属性堆栈中查找包含合法的nid类型的属性(X509_REQ_get_extension_nids函数说明),如果找到一个,则将属性值通过DER解码转换为扩展项堆栈。

12X509_REQ_get1_email

获取证书申请中申请者的邮件地址信息,信息来自X509_NAME *subjectSTACK_OF(X509_ATTRIBUTE) *attributes,返回一个堆栈。

13X509_REQ_get_attr

       根据指定位置,获取属性堆栈中的一个属性。

14int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos)

根据属性nid,从req的属性堆栈中查找对应属性,并返回。查找堆栈时,从lastpos位置开始查找。

15X509_REQ_get_attr_by_OBJ

       同上,根据ASN1_OBJECT来查找属性。

16X509_REQ_get_attr_count

       属性堆栈中属性的个数。

17X509_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

通过X509_REQ_set_extension_nids函数,用户可用定义自己的证书申请扩展项列,表,该函数的输入参数是一个nid列表。调用X509_REQ_set_extension_nids时,将ext_nids修改为用户输入参数,不再是默认的ext_nid_list

       18X509_REQ_get_pubkey

              获取公钥。

       19X509_REQ_print

              将证书申请信息输出到BIO中。

20int 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)

21X509_REQ_print_fp

       将证书申请消息输出到FILE中。

22X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)

根据证书信息,申请者私钥以及摘要算法生成证书请求。x为数字证书,pkey为申请人的私钥信息,md为摘要算法,pkeymd用于给证书申请签名。

    23X509 *X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey)

根据X509_REQ生成一个数字证书并返回,days指明其失效期,pkey为外送私钥,用于签名,返回数字证书。此函数无多大用处,由于没有指明颁发者,生成的数字证书颁发者就是X509_REQ中的申请人,并且证书的摘要固定用的是md5算法,另外,没有处理证书扩展项。

24int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey)

设置证书请求的公钥。

       25int X509_REQ_set_subject_name(X509_REQ *x, X509_NAME *name)

设置证书请求的者的名称,此函数调用X509_NAME_set函数来实现。

    26int X509_REQ_set_version(X509_REQ *x, long version)

设置证书请求信息的版本,此函数调用ASN1_INTEGER_set函数来完成。