《openssl编程》之配置文件
第八章?配置文件
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;
?}
總結
以上是生活随笔為你收集整理的《openssl编程》之配置文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《openssl编程》之BIO
- 下一篇: 《openssl 编程》之大数