8 配置文件

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);
	//ret = CONF_modules_load_file
	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("../1/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;
}