Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3442
  • 博文数量: 2
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-13 10:02
文章分类

全部博文(2)

文章存档

2015年(2)

我的朋友

分类: C/C++

2015-08-14 11:15:13

步骤:
1)初始化环境
a.新建证书存储区X509_STORE_new()
b.新建证书校验上下文X509_STORE_CTX_new()

2)导入根证书
a.读取CA证书,从DER编码格式化为X509结构d2i_X509()
b.将CA证书导入证书存储区X509_STORE_add_cert()

3)导入要校验的证书test
a.读取证书test,从DER编码格式化为X509结构d2i_X509()
b.在证书校验上下文初始化证书test,X509_STORE_CTX_init()
c.校验X509_verify_cert

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. #include <openssl/evp.h>
  5. #include <openssl/x509.h>
  6. #include <openssl/pem.h>

  7. #define CERT_PATH "/home/ycg/demoCA"
  8. #define ROOTCA_CERT "rootca_cert.pem"
  9. #define CLASS2CA_CERT "class2ca_cert.pem"
  10. #define CLIENT_CERT "client_cert.pem"


  11. #define GET_ROOT_CA_CERT(str) sprintf(str, "%s/%s", CERT_PATH, ROOTCA_CERT)
  12. #define GET_CLASS2_CA_CERT(str) sprintf(str, "%s/%s", CERT_PATH, CLASS2CA_CERT)
  13. #define GET_CLIENT_CERT(str, path, name) sprintf(str, "%s/%s", path, name)

  14. #define MAX_LEGTH 4096

  15. int my_load_cert(unsigned char *str, unsigned long *str_len,
  16.               const char *verify_cert, const unsigned int cert_len)
  17. {
  18.     FILE *fp;
  19.     fp = fopen(verify_cert, "rb");
  20.     if ( NULL == fp)
  21.     {
  22.         fprintf(stderr, "fopen fail\n");
  23.         return -1;
  24.     }

  25.     *str_len = fread(str, 1, cert_len, fp);
  26.     fclose(fp);
  27.     return 0;
  28. }

  29. X509 *der_to_x509(const unsigned char *der_str, unsigned int der_str_len)
  30. {
  31.     X509 *x509;
  32.     x509 = d2i_X509(NULL, &der_str, der_str_len);
  33.     if ( NULL == x509 )
  34.     {
  35.         fprintf(stderr, "d2i_X509 fail\n");
  36.         return NULL;
  37.     }
  38.     return x509;
  39. }

  40. X509 *pem_to_x509(const char *pem_file)
  41. {
  42.     X509 *x509;
  43.     BIO *cert = NULL;
  44.     if ((cert = BIO_new(BIO_s_file())) == NULL) {
  45.         goto end;
  46.     }

  47.     if (BIO_read_filename(cert, pem_file) <= 0) {
  48.         goto end;
  49.     }

  50.     x509 = PEM_read_bio_X509(cert, NULL,NULL, NULL);
  51.     if ( NULL == x509 )
  52.     {
  53.         fprintf(stderr, "PEM_read_bio_X509_AUX fail\n");
  54.         return NULL;
  55.     }
  56.     return x509;

  57.     end:
  58.     if (cert != NULL)
  59.         BIO_free(cert);

  60.     return NULL;
  61. }

  62. int x509_verify()
  63. {
  64.     int ret;
  65.     char cert[MAX_LEGTH];

  66.     X509 *user = NULL;
  67.     X509 *rootca = NULL;
  68.     X509 *class2ca = NULL;

  69.     X509_STORE *ca_store = NULL;
  70.     X509_STORE_CTX *ctx = NULL;
  71.     STACK_OF(X509) *ca_stack = NULL;

  72.     /* x509初始化 */
  73.     ca_store = X509_STORE_new();
  74.     ctx = X509_STORE_CTX_new();

  75.     /* root ca*/
  76.     GET_ROOT_CA_CERT(cert);
  77.     rootca = pem_to_x509(cert);
  78.     /* 加入证书存储区 */
  79.     ret = X509_STORE_add_cert(ca_store, rootca);
  80.     if ( ret != 1 )
  81.     {
  82.         fprintf(stderr, "X509_STORE_add_cert fail, ret = %d\n", ret);
  83.         goto EXIT;
  84.     }

  85.     GET_CLASS2_CA_CERT(cert);
  86.     class2ca = pem_to_x509(cert);

  87.     /* 加入证书存储区 */
  88.     ret = X509_STORE_add_cert(ca_store, class2ca);
  89.     if ( ret != 1 )
  90.     {
  91.         fprintf(stderr, "X509_STORE_add_cert fail, ret = %d\n", ret);
  92.         goto EXIT;
  93.     }

  94.     /* 需要校验的证书 */
  95.     GET_CLIENT_CERT(cert, CERT_PATH, CLIENT_CERT);
  96.     user = pem_to_x509(cert);

  97.     ret = X509_STORE_CTX_init(ctx, ca_store, user, ca_stack);
  98.     if ( ret != 1 )
  99.     {
  100.         fprintf(stderr, "X509_STORE_CTX_init fail, ret = %d\n", ret);
  101.         goto EXIT;
  102.     }

  103.     //openssl-1.0.1c/crypto/x509/x509_vfy.h
  104.     ret = X509_verify_cert(ctx);
  105.     if ( ret != 1 )
  106.     {
  107.         fprintf(stderr, "X509_verify_cert fail, ret = %d, error id = %d, %s\n",
  108.                 ret, ctx->error, X509_verify_cert_error_string(ctx->error));
  109.         goto EXIT;
  110.     }
  111. EXIT:
  112.     X509_free(rootca);
  113.     X509_free(class2ca);
  114.     X509_free(user);

  115.     X509_STORE_CTX_cleanup(ctx);
  116.     X509_STORE_CTX_free(ctx);

  117.     X509_STORE_free(ca_store);

  118.     return ret == 1 ? 0 : -1;
  119. }

  120. int main()
  121. {
  122.     OpenSSL_add_all_algorithms();
  123.     x509_verify();
  124.     return 0;
  125. }

阅读(2666) | 评论(0) | 转发(0) |
0

上一篇:Linux的nm查看动态和静态库中的符号

下一篇:没有了

给主人留下些什么吧!~~