openssl - X509证书操作函数

时间:2023-02-03 23:18:50

原文链接: 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

    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <openssl/evp.h>
    4. #include <openssl/x509.h>
    5. int tX509_Verify()
    6. {
    7. unsigned char usrCertificate1[4096];
    8. unsigned long usrCertificate1Len;
    9. unsigned char usrCertificate2[4096];
    10. unsigned long usrCertificate2Len;
    11. unsigned char derCrl[4096];
    12. unsigned long derCrlLen;
    13. unsigned char derRootCert[4096];
    14. unsigned long derRooCertLen;
    15. int i,rv;
    16. X509_STORE_CTX *ctx = NULL;
    17. X509 *usrCert1 = NULL;
    18. X509 *usrCert2 = NULL;
    19. X509 *caCert = NULL;
    20. X509 *rootCert = NULL;
    21. X509_CRL *Crl = NULL;
    22. STACK_OF(X509) *caCertStack = NULL;
    23. X509_STORE *rootCertStore = NULL;
    24. int j = 0;
    25. unsigned char *pTmp = NULL;
    26. FILE *fp;
    27. fp = fopen("RayCA.cert.cer","rb");
    28. if(fp == NULL){
    29. perror("open file failed\n");
    30. return -1;
    31. }
    32. derRooCertLen = fread(derRootCert,1,4096,fp);
    33. fclose(fp);
    34. fp = fopen("crl.crl","rb");
    35. if(fp == NULL){
    36. perror("open file failed\n");
    37. return -1;
    38. }
    39. derCrlLen = fread(derCrl,1,4096,fp);
    40. fclose(fp);
    41. fp = fopen("sangerhoo_req.pem.cert.cer","rb");
    42. if(fp == NULL){
    43. perror("open file failed\n");
    44. return -1;
    45. }
    46. usrCertificate1Len = fread(usrCertificate1,1,4096,fp);
    47. fclose(fp);
    48. fp = fopen("myserver.cert.cer","rb");
    49. if(fp == NULL){
    50. perror("open file failed\n");
    51. return -1;
    52. }
    53. usrCertificate2Len = fread(usrCertificate2,1,4096,fp);
    54. fclose(fp);
    55. printf("1\n");
    56. pTmp =  derRootCert;
    57. rootCert = d2i_X509(NULL,(unsigned const char **)&pTmp,derRooCertLen);
    58. if( NULL == rootCert){
    59. printf("d2i_X509 failed1,ERR_get_error=%s\n",ERR_reason_error_string(ERR_get_error()));
    60. return -1;
    61. }
    62. printf("2\n");
    63. pTmp = usrCertificate1;
    64. usrCert1 = d2i_X509(NULL,(unsigned const char **)&pTmp,usrCertificate1Len);
    65. if(usrCert1 == NULL){
    66. perror("d2i_X509 failed\n");
    67. return -1;
    68. }
    69. printf("3\n");
    70. pTmp = usrCertificate2;
    71. usrCert2 = d2i_X509(NULL,(unsigned const char **)&pTmp,usrCertificate2Len);
    72. if(usrCert2 == NULL){
    73. perror("d2i_X509 failed\n");
    74. return -1;
    75. }
    76. printf("4\n");
    77. pTmp = derCrl;
    78. Crl = d2i_X509_CRL(NULL,(unsigned const char **)&pTmp,derCrlLen);
    79. if(Crl == NULL){
    80. perror("d2i_X509 failed\n");
    81. return -1;
    82. }
    83. printf("5\n");
    84. rootCertStore = X509_STORE_new();
    85. X509_STORE_add_cert(rootCertStore,rootCert);
    86. X509_STORE_set_flags(rootCertStore,X509_V_FLAG_CRL_CHECK);
    87. X509_STORE_add_crl(rootCertStore,Crl);
    88. printf("6\n");
    89. rv = X509_STORE_CTX_init(ctx,rootCertStore,usrCert1,caCertStack);
    90. printf("1234\n");
    91. if(rv != 1){
    92. perror("X509_STORE_CTX_init failed\n");
    93. X509_free(usrCert1);
    94. X509_free(usrCert2);
    95. X509_free(rootCert);
    96. X509_STORE_CTX_cleanup(ctx);
    97. X509_STORE_CTX_free(ctx);
    98. X509_STORE_free(rootCertStore);
    99. return -1;
    100. }
    101. rv = X509_verify_cert(ctx);
    102. if(rv != 1){
    103. printf("verify usercert1 failed err=%d,info:%s\n",ctx->error,X509_verify_cert_error_string(ctx->error));
    104. }else{
    105. printf("verify usercert1 ok\n");
    106. }
    107. rv = X509_STORE_CTX_init(ctx,rootCertStore,usrCert2,caCertStack);
    108. if(rv != 1){
    109. perror("X509_STORE_CTX_init failed\n");
    110. X509_free(usrCert1);
    111. X509_free(usrCert2);
    112. X509_free(rootCert);
    113. X509_STORE_CTX_cleanup(ctx);
    114. X509_STORE_CTX_free(ctx);
    115. X509_STORE_free(rootCertStore);
    116. return -1;
    117. }
    118. rv = X509_verify_cert(ctx);
    119. if(rv != 1){
    120. printf("verify usercert2 failed err=%d,info:%s\n",ctx->error,X509_verify_cert_error_string(ctx->error));
    121. }else{
    122. printf("verify usercert2 ok\n");
    123. }
    124. X509_free(usrCert1);
    125. X509_free(usrCert2);
    126. X509_free(rootCert);
    127. X509_STORE_CTX_cleanup(ctx);
    128. X509_STORE_CTX_free(ctx);
    129. X509_STORE_free(rootCertStore);
    130. return 0;
    131. }
    132. int main()
    133. {
    134. tX509_Verify();
    135. }

openssl - X509证书操作函数的更多相关文章

  1. Openssl的证书操作

    先假设自己是一个CA,而且是一个root CA,Cliu8CA 生成一个CA的private key openssl genrsa -out caprivate.key 1024 当然可以跟密码 op ...

  2. CSP:使用CryptoAPI解码X509证书内容

    微软的CryptoAPI提供了一套解码X509证书的函数,一个X509证书解码之后,得到一个PCCERT_CONTEXT类型的结构体指针. 通过该结构体,我们就能够获取想要的证书项和属性等. X509 ...

  3. PHP的OpenSSL加密扩展学习(三):证书操作

    关于对称和非对称的加密操作,我们已经学习完两篇文章的内容了,接下来,我们就继续学习关于证书的生成. 生成 CSR 证书签名请求 CSR 是用于生成证书的签名请求,在 CSR 中,我们需要一些 dn 信 ...

  4. OpenSSL 使用拾遗(二)---- X509 证书的 SKID&sol;AKID 字段

    SKID(证书使用者密钥标识符,subject key identifier 的简称)和 AKID(证书颁发机构密钥标识符,authority key identifier 的简称)是 X509 证书 ...

  5. 通过OpenSSL解码X509证书文件

    在Windows平台下.假设要解析一个X509证书文件,最直接的办法是使用微软的CryptoAPI. 可是在非Windows平台下,就仅仅能使用强大的开源跨平台库OpenSSL了.一个X509证书通过 ...

  6. 通过OpenSSL解析X509证书基本项

    在之前的文章"通过OpenSSL解码X509证书文件"里.讲述了怎样使用OpenSSL将证书文件解码,得到证书上下文结构体X509的方法. 以下我们接着讲述怎样通过证书上下文结构体 ...

  7. 使用OpenSSL证书操作详解

    一.OpenSSL简介 OpenSSL支持多种秘钥算法,包括RSA.DSA.ECDSA,RSA使用比较普遍.官网地址:https://www.openssl.org/,一般CeontOS系统都装有Op ...

  8. 【openssl】利用openssl完成X509证书和PFX证书之间的互转

    利用openssl完成X509证书和PFX证书之间的互转 # OpenSSL的下载与安装: 1.下载地址: 官方网址—— https://www.openssl.org/source/ OpenSSL ...

  9. openssl解析国密X509证书

    openssl解析国密X509证书,把公钥拿出来重写一下就行了        x = strToX509(pbCert, pulCertLen);dwRet = getCertPubKey(x, &a ...

随机推荐

  1. shell编程常用的截取字符串操作

    1.          常用的字符串操作 1.1.           替换字符串:$ echo ${var/ /_}#支持正怎表达式 / /表示搜索到第一个替换,// /表示搜索到的结果全部替换. ...

  2. Gearman使用示例

    最近的一个旧项目重构过程中,使用到了gearman这个开源项目,简单来讲,这是一个类似MQ的异步系统,一边派发任务,一边处理任务(有类似MQ中的消息发送方与接收方),目前支持java,php等多种语言 ...

  3. 那些年使用Hive踩过的坑

    1.概述 这个标题也是用血的教训换来的,希望对刚进入hive圈的童鞋和正在hive圈爬坑的童鞋有所帮助.打算分以下几个部分去描述: Hive的结构 Hive的基本操作 Hive Select Hive ...

  4. &lt&semi;HTML5和CSS3响应式WEB设计指南&gt&semi;译者序

    "不是我不明白,这世界变化快."崔健的这首歌使用在互联网领域最合适不过.只短短数年的功夫,互联网的浪潮还没过去,移动互联网的时代已经来临.人们已经习惯将越来越多的时间花在各种移动设 ...

  5. Docker的单主机容器网络

    作者:杨冬 欢迎转载,也请保留这段声明.谢谢! 出处: https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/ 本篇文章主要探索Do ...

  6. CF&num;345 &lpar;Div1&rpar;

    论蒟蒻如何被cf虐 以下是身败名裂后的题解菌=========== Div1 A.Watchmen 有n个点,每个点有一个坐标.求曼哈顿距离=欧几里得距离的点对数量. 只需要统计x或y一样的点对数量. ...

  7. Android使用SurfaceView实现墨迹天气的风车效果

    SurfaceView也是继承自View,它和我们以前接触到的View(Button.TextView等)最大的不同是,SurfaceView可以有一个单独的线程进行绘制,这个线程区别于UI线程(主线 ...

  8. 函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。

    在dllimport中加入CallingConvention参数就行了,[DllImport(PCAP_DLL, CharSet = CharSet.Auto, CallingConvention = ...

  9. 解决m2eclipse之Unable to update index for central &vert;

    maven 不能更新,真烦人,转载他人的 maven是个好东西,eclipse上的maven插件m2eclipse也非常方便,但是最近这个东西经常无法连接到maven index的更新网站,然后ecl ...

  10. -bash&colon;syntax error near unexpected token &&num;39&semi;&lpar;&&num;39&semi;

    在Xshell5中编写int main(int argc,char** argv)时, 出现-bash:syntax error near unexpected token '('  : 可是我是按照 ...