openssl配置的幾個概念
openssl.conf
.include /path/to/fipsmodule.cnf
[openssl_init]
providers = provider_sect
alg_section = alg_sect
[provider_sect]
default = default_sect
fips = fips_sect
[default_sect]
activate = 0
[alg_sect]
default_properties = fips=yes
/path/to/fipemodule.cnf
[fips_sect]
activate = 1
conditional-errors = 1
security-checks = 1
module-mac = 12:F1:...:67:03
一個概念provider,和algrithm:
- 一個provider是一組algrithm的合集权埠,也包括一些provider內(nèi)屬性暂吉。
- 例子里有兩個provider:default和fips
- fips這個provider自動具有"fips=yes"的屬性帽借,但是default這個provider自動具有的屬性是”fips=no"于游。
3.1 也可以通過程序OSSL_PROVIDER_load/OSSL_PROVIDER_unload來加載和卸載一個provider麸折。 - provider的屬性activate=1表示是否可以用available。即OSSL_PROVIDER_available()返回true或者false挟秤。
4.1:但是default這個provider的activate屬性無效壹哺,它總是available的。 - alg_sect里的default_properties表示algritmh的缺省查找provider屬性艘刚,其中前綴default_表示缺省的意思管宵,不是表示default這個provider。
5.1 簡單的說攀甚,就是用戶要查找一個algrithm時箩朴,如果沒有指定從哪個provider里面查找(通過提供provider屬性的方法),那么就使用這里定義的屬性來表示從哪一個provider里面查找秋度。
給一個程序例子
char * providernames[] = {"default", "fips"};
for (int i = 0; i < 2; i++) {
printf("Provider %s: %s\n", providernames[i], OSSL_PROVIDER_available(NULL, providernames[i]) == 1 ? "available" : "unavailable");
}
判斷一個provider是否可用炸庞,如果在配置文件里activate=1表示可用,activate=0表示不可用静陈。
當(dāng)然default這個provider除外燕雁,它總是可以,不管activate的值鲸拥。
OSSL_PROVIDER* provider = OSSL_PROVIDER_load(NULL, "fips");
if (provider == NULL) {
printf("Load provider '%s' failed\n", providername);
} else {
printf("Load provider '%s' succes\n", providername);
}
...
OSSL_PROVIDER_unload(provider);
加載和卸載一個provider拐格。
int fips_default_enable = EVP_default_properties_is_fips_enabled(NULL);
printf("FIPS default enabled=%d/%s\n", fips_default_enable, fips_default_enable == 1 ? "true": "false");
檢查FIPS defaut enable屬性,這個值就是配置文件里的[alg_sect]節(jié)下的default_properties = fips=yes
屬性值刑赶。這個值也可以通過程序修改:
if (!EVP_default_properties_enable_fips(NULL, 1)) {
printf("Failed to sett default fips enable\n");
}
下面獲取algrithim
md = EVP_MD_fetch(NULL, "SHA256", NULL);
if (md == NULL) {
printf("Provider is %s\n", "NULL");
} else {
printf("Provider is %s\n", OSSL_PROVIDER_get0_name(EVP_MD_get0_provider(md)));
}
這個地方能獲取是從那個provider里面取得algrithm捏浊,比如'default', 還是'fips'。
舉例來說:
ID | [alg_sect]default_properties = fips=no | [alg_sect]default_properties = fips=yes |
---|---|---|
EVP_MD_fetch(NULL, "MD5", NULL) | default | NULL |
EVP_MD_fetch(NULL, "SHA256", NULL) | default | fips |
EVP_MD_fetch(NULL, "MD5", "fips=no") | default | default |
EVP_MD_fetch(NULL, "SHA256", "fips=no") | default | default |
EVP_MD_fetch(NULL, "MD5", "fips=yes") | NULL | NULL |
EVP_MD_fetch(NULL, "SHA256", "fips=yes") | fips | FIPS |
結(jié)論:
EVP_MD_fetch如果參數(shù)指定了provider屬性(fips=yes)那么具有高優(yōu)先權(quán)撞叨。
- fips=no那么就從default這個provider里面取金踪,因為default這個provider的fips=no。
- fips=yes那么就從fips這個provider里面取牵敷,因為fips這個provider的fips=yes胡岔。
- fips沒指定,那么從algrithm指定的屬性里面查詢:
- default_properties = fips=no枷餐,表示缺省找default這個provider
- default_properties = fips=yes, 表示缺省找fips這個provider靶瘸。