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;
}