《openssl编程》之配置文件

本文介绍OpenSSL配置文件的结构及读取方法,包括配置文件的组成部分、主要函数及其使用示例,帮助读者理解如何利用OpenSSL进行证书管理和配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第八章 配置文件

8.1 概述

 Openssl采用自定义的配置文件来获取配置信息。Openssl的配置文件主要由如下内容组成:

注释信息,注释信息由#开头;

段信息,段信息由[xxx]来表示,其中xxx为段标识;

属性-值信息,表示方法为a = b,这种信息可以在一个段内也可以不属于任何段。

典型配置文件为apps/openssl.cnf(同时该文件也是openssl最主要的配置文件)。摘取部分内容如下:

 # OpenSSL example configuration file.

oid_section  = new_oids

[ CA_default ]

dir  = ./demoCA  # Where everything is kept

certs  = $dir/certs  # Where the issued certs are kept

default_days = 365  #注意,这里是一个数字

8.2 openssl配置文件读取

 Openssl读取配置文件的实现源码在crypto/conf中,主要函数定义在conf.h中。函数一般以CONF或NCONF(new conf,新函数)开头。本文主要介绍了新的conf函数的使用方。主要的数据结构在crypto/conf.h中定义如下:

 typedef struct

 {

 char *section;

 char *name;

 char *value;

 } CONF_VALUE;

 section表明配置文件的段,name表示这个段中的一个属性,value则是这个属性的值。Openssl采用哈希表来存放这些信息,便于快速查找。

8.3 主要函数

 1) NCONF_new

生成一个CONF结构。

 2) CONF_free

释放空间,以及释放存储在散列表中的数据。

3) CONF_load

函数定义:LHASH *CONF_load(LHASH *conf, const char *file, long *eline),该函数根据输入配置文件名,读取信息存入散列表,如果有错,eline为错误行。

 4) CONF_load_bio/ CONF_load_fp

根据bio或者文件句柄读取配置信息并存入散列表。

 5) CONF_get_section

给定段信息,得到散列表中的所有对应值。用于获取配置文件中指定某个段下的所有信息,这些信息存放在CONF_VALUE的堆栈中。

6) CONF_get_string

给定段以及属性值,得到对应的字符串信息。

 7) CONF_get_number

给定段和属性值,获取对应的数值信息。

 8) CONF_get1_default_config_file

获取默认的配置文件名,比如openssl.cnf。

8.4 编程示例

 示例1:

 #include <openssl/conf.h>

 int main()

 {

  CONF *conf;

  long eline,result;

  int  ret;

  char *p;

  BIO *bp;

 

  conf=NCONF_new(NULL);

 #if 0

  bp=BIO_new_file("openssl.cnf","r");

  NCONF_load_bio(conf,bp,&eline);

 #else

  ret=NCONF_load(conf,"openssl.cnf",&eline);

  if(ret!=1)

  {

   printf("err!\n");

   return -1;

  }

 #endif

  p=NCONF_get_string(conf,NULL,"certs");

  if(p==NULL)

   printf("no global certs info\n");

  p=NCONF_get_string(conf,"CA_default","certs");

  printf("%s\n",p);

  p=NCONF_get_string(conf,"CA_default","default_days");

  printf("%s\n",p);

  ret=NCONF_get_number_e(conf,"CA_default","default_days",&result);

  printf("%d\n",result);

  ret=NCONF_get_number(conf,"CA_default","default_days",&result);

  printf("%d\n",result);

  NCONF_free(conf);

  return 0;

 }

 本示例用来读取配置文件信息,这些信息可以是字符串也可以是数字。

 

 示例2:

 NCONF_get_section的用法:

 #include <openssl/conf.h>

 int main()

 {

  CONF     *conf;

  BIO      *bp;

  STACK_OF(CONF_VALUE) *v;

  CONF_VALUE    *one;

  int      i,num;

  long     eline;

  

  conf=NCONF_new(NULL);

  bp=BIO_new_file("openssl.cnf","r");

  if(bp==NULL)

  {

   printf("err!\n");

   return -1;

  }

  NCONF_load_bio(conf,bp,&eline);

  v=NCONF_get_section(conf,"CA_default");

  num=sk_CONF_VALUE_num(v);

  printf("section CA_default :\n");

  for(i=0;i<num;i++)

  {

   one=sk_CONF_VALUE_value(v,i);

   printf("%s = %s\n",one->name,one->value);

  }

  BIO_free(bp);

  printf("\n");

  return 0;

 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值