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内属性。
- 例子里有两个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表示不可用。
当然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]节下的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 |
结论:
EVP_MD_fetch如果参数指定了provider属性(fips=yes)那么具有高优先权。
- 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。
网友评论