X.509标准是密码学里公钥证书的格式标准。X.509 证书己应用在包括TLS/SSL(WWW万维网安全浏览的基石)在内的众多 Internet协议里,同时它也有很多非在线的应用场景,比如电子签名服务。X.509证书含有公钥和标识(主机名、组织或个人),并由证书颁发机构(CA)签名(或自签名)。一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息一种非常通用的证书格式,所有的证书都符合X.509 国际标准。
目前X.509有不同的版本,但是每个版本都包含了这些信息:
1.Version ——X509的版本号
2.Serial Number——证书序列号
3.Signature algorithm ——签名所使用的算法,就是指的这个数字证书的对指纹进行签名时所使用的加密算法,这样就可以使用证书发布机构的证书里面的公钥,根据这个算法对签名进行解密。指纹(也叫hash值)摘要后再用私钥加密结果就是数字签名。
4.Signature hash algorithm——签名哈希算法
5.Issuer—— 证书的发布机构,指出是什么机构发布的这个证书,也就是指明这个证书是哪个公司创建的(只是创建证书,不是指证书的使用者)。
6.Valid from , Valid to——证书的有效期,也就是证书的有效时间,或者说证书的使用期限。 过了有效期限,证书就会作废,不能使用了。
7.Subject (主题)——这个证书是发布给谁的,或者说证书的所有者,一般是某个人或者某个公司名称、机构的名称、公司网站的网址等。
其实就是我们在之前进行证书填写时的必要信息。
8.Public key (公钥)——这个我们在前面介绍公钥密码体制时介绍过,公钥是用来对消息进行加密的。
9.Thumbprint, Thumbprint algorithm (指纹以及指纹算法)——这个是用来保证证书的完整性的,也就是说确保证书没有被修改过。 其原理就是在发布证书时,发布者根据摘要算法(一个hash算法)计算整个证书的hash值(也叫指纹)并用私钥加密后成为签名和证书放在一起,使用者在打开证书时,先用公钥解密签名,获得指纹,然后自己根据摘要算法计算一下证书的hash值(指纹),如果和附带的指纹对的上,就说明证书没有被修改过,因为证书的内容被修改后,根据证书的内容计算的出的hash值(指纹)是会变化的。
获得一份X.509证书,必须请求CA发给你证书。用户提供自己的公钥,并提供有关自己的某些特定信息。然后在这些信息上用私钥做数字签名,并将整个数据包(称为证书请求)发给CA。CA做一些努力来验证用户提供的信息是正确的,然后就生成证书并返回给用户。
1、 DER编码转换为内部结构函数
X509 *d2i_X509(X509 **cert, unsigned char **d, int len);
函数功能:把一个DER编码的证书数据转化成OpenSSL内部结构体。
参数:cert:[OUT]X509结构体。 D:[IN]DER编码的证书数据指针地址。Len证书数据长度;
返回值:编码后的X509结构体数据
2、 获得证书版本函数X509_get_version
#define X509_get_version(x) ASN1_INTEGER_get((x)->cert_info->version)
参数:x:[IN]X509*结构体数据结构。
返回值:证书版本,数据类型“LONG”
3、 获得证书序列号函数
ASN1_INTEGER *X509_get_serialNumber(X509 *x);
返回值:证书序列号,数据类型“ASN1_INTEGER”.
4、 获得证书颁发者信息函数
X509_NAME *X509_get_issuer_name(X509 *a);
注*:X509_NAME结构体包括多个X509_NAME_ENTRY结构体。X509_NAME_ENTRY保存了颁发者的信息,这些信息包括对象和值(object 和value)。对象的类型包括国家、通用名、单位、组织、地区、邮件等。
5、 获得证书拥有者信息函数
X509_NAME *X509_get_subject_name(X509 *a);
该函数设置证书请求人的主题名,X509_NAME *name参数就是要设置的主题名。
6、 获得证书有效期的起始日期函数
#define X509_get_notBefore(x) ((x)->cert_info->validity->notBefore)
返回值:证书起始有效期,数据类型“ASN1_TIME”
7、 获得证书有效期的终止日期函数
#define X509_get_notAfter(x) ((x)->cert_info->validity->notAfter)
8、 获得证书公钥函数
EVP_PKEY *X509_get_pubkey(X509 *x);
9、 创建和释放证书存储区
X509_STORE *X509_STORE_new(void);
Void X509_STORE_free(X509_STORE *v);
函数功能:创建和释放一个X509_STORE结构体,主要用于验证证书。
10、向证书存储区添加证书
Int X509_STORE_add_cert(X509_STORE *ctx, X509 *x);
函数功能:添加信任的根证书到证书存储区。
返回值:1成功,否则为0
11、向证书存储区添加证书吊销列表
Int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x);
功能:添加CRL到证书存储区。
参数:x:证书吊销列表。Ctx:证书存储区。
返回值:1成功,否则为0。
12、创建证书存储区上下文环境函数
X509_STORE_CTX *X509_STORE_CTX_new(void);
返回值:操作成功返回证书存储区上下文环境指针,否则返回NULL。
13、释放证书存储区上下文环境
Void X509_STORE_CTX_free(X509_STORE_CTX *ctx);
14、初始化证书存储区上下文环境函数
Int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store, X509 *x509, STACK_OF(X509) *chain);
函数功能:初始化证书存储区上下文环境,设置根证书、待验证的证书、CA证书链。
15、验证证书函数
Int X509_verify_cert(X509_STORE_CTX *ctx);
返回值:验证成功返回1,否则返回0
16.X509_REQ* X509_REQ_dup(X509_REQ *req);
复制一份X509_REQ结构。它是宏定义,实际上是由ASN1_dup函数来完成复制工作。
17.X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, constEVP_MD *md);
对X509_REQ中X509_REQ_INFO结构用pkey与md进行签名,并用算法标识与签名值填充X509_REQ中的sig_alg与signature域。
成功返回字节数,失败返回0.
18.X509_REQ_verify(X509_REQ *a, EVP_PKEY *r);
与签名相对应,对签名进行验证,所以将公钥pkey传入就可以了。
参考:
1.https://blog.csdn.net/liao20081228/article/details/77411458
2.https://blog.csdn.net/zqt520/article/details/26965797