《openssl编程》之配置文件
第八章?配置文件
8.1?概述
?Openssl采用自定義的配置文件來獲取配置信息。Openssl的配置文件主要由如下內(nèi)容組成:
注釋信息,注釋信息由#開頭;
段信息,段信息由[xxx]來表示,其中xxx為段標(biāo)識(shí);
屬性-值信息,表示方法為a?=?b,這種信息可以在一個(gè)段內(nèi)也可以不屬于任何段。
典型配置文件為apps/openssl.cnf(同時(shí)該文件也是openssl最主要的配置文件)。摘取部分內(nèi)容如下:
?#?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??#注意,這里是一個(gè)數(shù)字
8.2?openssl配置文件讀取
?Openssl讀取配置文件的實(shí)現(xiàn)源碼在crypto/conf中,主要函數(shù)定義在conf.h中。函數(shù)一般以CONF或NCONF(new?conf,新函數(shù))開頭。本文主要介紹了新的conf函數(shù)的使用方。主要的數(shù)據(jù)結(jié)構(gòu)在crypto/conf.h中定義如下:
?typedef?struct
?{
?char?*section;
?char?*name;
?char?*value;
?}?CONF_VALUE;
?section表明配置文件的段,name表示這個(gè)段中的一個(gè)屬性,value則是這個(gè)屬性的值。Openssl采用哈希表來存放這些信息,便于快速查找。
8.3?主要函數(shù)
?1)?NCONF_new
生成一個(gè)CONF結(jié)構(gòu)。
?2)?CONF_free
釋放空間,以及釋放存儲(chǔ)在散列表中的數(shù)據(jù)。
3)?CONF_load
函數(shù)定義:LHASH?*CONF_load(LHASH?*conf,?const?char?*file,?long?*eline),該函數(shù)根據(jù)輸入配置文件名,讀取信息存入散列表,如果有錯(cuò),eline為錯(cuò)誤行。
?4)?CONF_load_bio/?CONF_load_fp
根據(jù)bio或者文件句柄讀取配置信息并存入散列表。
?5)?CONF_get_section
給定段信息,得到散列表中的所有對(duì)應(yīng)值。用于獲取配置文件中指定某個(gè)段下的所有信息,這些信息存放在CONF_VALUE的堆棧中。
6)?CONF_get_string
給定段以及屬性值,得到對(duì)應(yīng)的字符串信息。
?7)?CONF_get_number
給定段和屬性值,獲取對(duì)應(yīng)的數(shù)值信息。
?8)?CONF_get1_default_config_file
獲取默認(rèn)的配置文件名,比如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;
?}
?本示例用來讀取配置文件信息,這些信息可以是字符串也可以是數(shù)字。
?
?示例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;
?}
總結(jié)
以上是生活随笔為你收集整理的《openssl编程》之配置文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《openssl编程》之BIO
- 下一篇: 《openssl 编程》之文本数据库