openssl - X509证书操作函数
原文链接: http://blog.csdn.net/zqt520/article/details/26965797
现有的证书大都采用X。509规范,主要同以下信息组成:版本号、证书序列号、有效期、拥有者信息、颁发者信息、其他扩展信息、拥有者的公钥、CA对以上信息的签名。
OpenSSL实现了对X。509数字证书的所有操作。包括签发数字证书、解析和验证证书等。
涉及证书操作的主要函数有验证证书(验证证书链、有效期、CRL)、解析证书(获得证书的版本、序列号、颁发者信息、主题信息、公钥、有效期等)。
主要函数
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);
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
- #include <stdio.h>
- #include <string.h>
- #include <openssl/evp.h>
- #include <openssl/x509.h>
- int tX509_Verify()
- {
- unsigned char usrCertificate1[4096];
- unsigned long usrCertificate1Len;
- unsigned char usrCertificate2[4096];
- unsigned long usrCertificate2Len;
- unsigned char derCrl[4096];
- unsigned long derCrlLen;
- unsigned char derRootCert[4096];
- unsigned long derRooCertLen;
- int i,rv;
- X509_STORE_CTX *ctx = NULL;
- X509 *usrCert1 = NULL;
- X509 *usrCert2 = NULL;
- X509 *caCert = NULL;
- X509 *rootCert = NULL;
- X509_CRL *Crl = NULL;
- STACK_OF(X509) *caCertStack = NULL;
- X509_STORE *rootCertStore = NULL;
- int j = 0;
- unsigned char *pTmp = NULL;
- FILE *fp;
- fp = fopen("RayCA.cert.cer","rb");
- if(fp == NULL){
- perror("open file failed\n");
- return -1;
- }
- derRooCertLen = fread(derRootCert,1,4096,fp);
- fclose(fp);
- fp = fopen("crl.crl","rb");
- if(fp == NULL){
- perror("open file failed\n");
- return -1;
- }
- derCrlLen = fread(derCrl,1,4096,fp);
- fclose(fp);
- fp = fopen("sangerhoo_req.pem.cert.cer","rb");
- if(fp == NULL){
- perror("open file failed\n");
- return -1;
- }
- usrCertificate1Len = fread(usrCertificate1,1,4096,fp);
- fclose(fp);
- fp = fopen("myserver.cert.cer","rb");
- if(fp == NULL){
- perror("open file failed\n");
- return -1;
- }
- usrCertificate2Len = fread(usrCertificate2,1,4096,fp);
- fclose(fp);
- printf("1\n");
- pTmp = derRootCert;
- rootCert = d2i_X509(NULL,(unsigned const char **)&pTmp,derRooCertLen);
- if( NULL == rootCert){
- printf("d2i_X509 failed1,ERR_get_error=%s\n",ERR_reason_error_string(ERR_get_error()));
- return -1;
- }
- printf("2\n");
- pTmp = usrCertificate1;
- usrCert1 = d2i_X509(NULL,(unsigned const char **)&pTmp,usrCertificate1Len);
- if(usrCert1 == NULL){
- perror("d2i_X509 failed\n");
- return -1;
- }
- printf("3\n");
- pTmp = usrCertificate2;
- usrCert2 = d2i_X509(NULL,(unsigned const char **)&pTmp,usrCertificate2Len);
- if(usrCert2 == NULL){
- perror("d2i_X509 failed\n");
- return -1;
- }
- printf("4\n");
- pTmp = derCrl;
- Crl = d2i_X509_CRL(NULL,(unsigned const char **)&pTmp,derCrlLen);
- if(Crl == NULL){
- perror("d2i_X509 failed\n");
- return -1;
- }
- printf("5\n");
- rootCertStore = X509_STORE_new();
- X509_STORE_add_cert(rootCertStore,rootCert);
- X509_STORE_set_flags(rootCertStore,X509_V_FLAG_CRL_CHECK);
- X509_STORE_add_crl(rootCertStore,Crl);
- printf("6\n");
- rv = X509_STORE_CTX_init(ctx,rootCertStore,usrCert1,caCertStack);
- printf("1234\n");
- if(rv != 1){
- perror("X509_STORE_CTX_init failed\n");
- X509_free(usrCert1);
- X509_free(usrCert2);
- X509_free(rootCert);
- X509_STORE_CTX_cleanup(ctx);
- X509_STORE_CTX_free(ctx);
- X509_STORE_free(rootCertStore);
- return -1;
- }
- rv = X509_verify_cert(ctx);
- if(rv != 1){
- printf("verify usercert1 failed err=%d,info:%s\n",ctx->error,X509_verify_cert_error_string(ctx->error));
- }else{
- printf("verify usercert1 ok\n");
- }
- rv = X509_STORE_CTX_init(ctx,rootCertStore,usrCert2,caCertStack);
- if(rv != 1){
- perror("X509_STORE_CTX_init failed\n");
- X509_free(usrCert1);
- X509_free(usrCert2);
- X509_free(rootCert);
- X509_STORE_CTX_cleanup(ctx);
- X509_STORE_CTX_free(ctx);
- X509_STORE_free(rootCertStore);
- return -1;
- }
- rv = X509_verify_cert(ctx);
- if(rv != 1){
- printf("verify usercert2 failed err=%d,info:%s\n",ctx->error,X509_verify_cert_error_string(ctx->error));
- }else{
- printf("verify usercert2 ok\n");
- }
- X509_free(usrCert1);
- X509_free(usrCert2);
- X509_free(rootCert);
- X509_STORE_CTX_cleanup(ctx);
- X509_STORE_CTX_free(ctx);
- X509_STORE_free(rootCertStore);
- return 0;
- }
- int main()
- {
- tX509_Verify();
- }
openssl - X509证书操作函数的更多相关文章
- Openssl的证书操作
先假设自己是一个CA,而且是一个root CA,Cliu8CA 生成一个CA的private key openssl genrsa -out caprivate.key 1024 当然可以跟密码 op ...
- CSP:使用CryptoAPI解码X509证书内容
微软的CryptoAPI提供了一套解码X509证书的函数,一个X509证书解码之后,得到一个PCCERT_CONTEXT类型的结构体指针. 通过该结构体,我们就能够获取想要的证书项和属性等. X509 ...
- PHP的OpenSSL加密扩展学习(三):证书操作
关于对称和非对称的加密操作,我们已经学习完两篇文章的内容了,接下来,我们就继续学习关于证书的生成. 生成 CSR 证书签名请求 CSR 是用于生成证书的签名请求,在 CSR 中,我们需要一些 dn 信 ...
- OpenSSL 使用拾遗(二)---- X509 证书的 SKID/AKID 字段
SKID(证书使用者密钥标识符,subject key identifier 的简称)和 AKID(证书颁发机构密钥标识符,authority key identifier 的简称)是 X509 证书 ...
- 通过OpenSSL解码X509证书文件
在Windows平台下.假设要解析一个X509证书文件,最直接的办法是使用微软的CryptoAPI. 可是在非Windows平台下,就仅仅能使用强大的开源跨平台库OpenSSL了.一个X509证书通过 ...
- 通过OpenSSL解析X509证书基本项
在之前的文章"通过OpenSSL解码X509证书文件"里.讲述了怎样使用OpenSSL将证书文件解码,得到证书上下文结构体X509的方法. 以下我们接着讲述怎样通过证书上下文结构体 ...
- 使用OpenSSL证书操作详解
一.OpenSSL简介 OpenSSL支持多种秘钥算法,包括RSA.DSA.ECDSA,RSA使用比较普遍.官网地址:https://www.openssl.org/,一般CeontOS系统都装有Op ...
- 【openssl】利用openssl完成X509证书和PFX证书之间的互转
利用openssl完成X509证书和PFX证书之间的互转 # OpenSSL的下载与安装: 1.下载地址: 官方网址—— https://www.openssl.org/source/ OpenSSL ...
- openssl解析国密X509证书
openssl解析国密X509证书,把公钥拿出来重写一下就行了 x = strToX509(pbCert, pulCertLen);dwRet = getCertPubKey(x, &a ...
随机推荐
- java:矩阵面积
实现一个矩阵类Rectangle,包含如下的一些成员变量与函数: 两个共有的成员变量 width 和 height 分别代表宽度和高度. 一个构造函数,接受2个参数 width 和 height 来设 ...
- 023 SpringMVC拦截器
一:拦截器的HelloWorld 1.首先自定义拦截器 只要实现接口就行. package com.spring.it.interceptors; import javax.servlet.http. ...
- 040 关于hive元数据的解析
一:原理 1.整体原理 找到数据库 找到表 先找分区表,然后不找SDS表了,先去找PARTITIONS表,根据这张表的SD_ID找对应的HDFS路劲 再普通表,直接根据SDS表的中SD_ID找到对应的 ...
- C++ 的static 与 const
1.static成员变量(非const)必须在类外定义,在类中只是作为声明(声明其scope为该类),不能使用类初始化成员列表来初始化,只能在定义的时候初始化. 2.static const的成员变量 ...
- 洛谷 P1002 过河卒 【棋盘dp】
题目链接:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...
- loj#2574. 「TJOI2018」智力竞赛 (路径覆盖)
目录 题目链接 题解 代码 题目链接 loj#2574. 「TJOI2018」智力竞赛 题解 就是求可重路径覆盖之后最大化剩余点的最小权值 二分答案后就是一个可重复路径覆盖 处理出可达点做二分图匹配就 ...
- APIO2018 铜滚记
「一旦闭上双眼,就昏昏欲睡」「仿佛与这个世界的联系,被瞬间切断」「可是,负罪感与背德感又会在黑暗中将我吞噬」「即使这样,却也无法与身体的疲惫抗衡」 「如果,这些东西也无法让意识的存在稳定下来的话」「那 ...
- Wannafly挑战赛25游记
Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...
- extend与append的区别
''' list 的两个方法extend 和 append 看起来类似,但实际上完全不同. extend接受一个参数,这个参数,总是一个list,并把list中的每个元素添加到原list中 appen ...
- C#的?和??
1.?? 为了实现Nullable数据类型转换成non-Nullable类型数据,才有的一个操作符: 意义:一变量取值,取符号左边的值,若左边为null,那么取赋值??右边的: 栗子:int a=3 ...