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地址。
-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函数来完成。
实践详情见本博客中置顶链接