• 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

    显示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函数来完成。

    实践详情见本博客中置顶链接

  • 相关阅读:
    表空间及组成表空间的物理文件
    MVCC
    innodb结构解析工具---innodb_ruby
    慢查询日志 与 general_log
    思考mysql内核之初级系列
    mysql内核源代码深度解析 缓冲池 buffer pool 整体概述
    change buffer
    python 学习笔记 copy
    xargs
    给tcpdump加点颜色看看
  • 原文地址:https://www.cnblogs.com/Jclemo/p/6132028.html
Copyright © 2020-2023  润新知