как установить минимальную и максимальную версии протокола в библиотеке openssl

#c #struct #openssl

Вопрос:

Я не смог узнать, как установить минимальную и максимальную версию протокола в этой библиотеке:

Есть функция: static int test_func(void) в тестовом файле

 sysdefaulttest.c
 

Который использует версию протокола min и max:

 static int test_func(void) {
if (!TEST_int_eq(SSL_CTX_get_min_proto_version(ctx), TLS1_2_VERSION)
    amp;amp; !TEST_int_eq(SSL_CTX_get_max_proto_version(ctx), TLS1_2_VERSION)) {
    TEST_info("min/max version setting incorrect");
    return 0;
}
return 1;}
 

В моем случае этот тест провалился. Контекстная структура » ctx » в моем случае имеет эти 2 значения как ноль. Похоже, они должны быть установлены где-то в библиотеке.

 ctx.min_proto_ver, ctx.max_proto_ver
 

В моем случае оба вышеперечисленных параметра показывают нулевое значение.

 SSL_CTX_get_min_proto_version(ctx);
SSL_CTX_get_max_proto_version(ctx);
 

Где я могу установить эти значения версий в библиотеке?

Ответ №1:

Скорее всего, с

  • SSL_CTX_set_min_proto_version и
  • SSL_CTX_set_max_proto_version

функции (https://github.com/openssl/openssl/blob/master/include/openssl/ssl.h.in#L1451).

Из документов:

Функции настройки были добавлены в OpenSSL 1.1.0. Функции получения были добавлены в OpenSSL 1.1.1.


Однако редактировать В тесте вам не придется ничего делать. После создания библиотеки вы бы запустили тест следующим образом:

 ]$ make TESTS="test_sysdefault" test
...
90-test_sysdefault.t .. ok
All tests successful.
Files=1, Tests=1,  0 wallclock secs ( 0.00 usr  0.00 sys    0.11 cusr  0.01 csys =  0.12 CPU)
Result: PASS
 

Это выполняет рецепт теста из test/recipes/90-test_sysdefault.t , который задает OPENSSL_CONF переменную среды в test/sysdefault.cnf . Этот файл конфигурации устанавливает версию протокола на 1.2:

 ]$ cat ./test/sysdefault.cnf
# Configuration file to test system default SSL configuration
...
[ssl_default_sect]
MaxProtocol = TLSv1.2
MinProtocol = TLSv1.2
 

и тест должен загрузить этот файл:

 int global_init(void)
{
    if (!OPENSSL_init_ssl(OPENSSL_INIT_ENGINE_ALL_BUILTIN
                          | OPENSSL_INIT_LOAD_CONFIG, NULL))
 

Зная это, тест может быть выполнен непосредственно, делая то же самое:

 ]$ LD_LIBRARY_PATH=. OPENSSL_CONF=test/sysdefault.cnf ./test/sysdefaulttest
1..1
ok 1 - test_func
 

(здесь мне пришлось дополнительно использовать LD_LIBRARY_PATH , потому что я только создал библиотеку и не установил ее)

Если мы хотим убедиться, что sysdefault.cnf он действительно открыт, мы можем использовать strace :

 ]$ LD_LIBRARY_PATH=. OPENSSL_CONF=test/sysdefault.cnf strace -f -e trace=/open ./test/sysdefaulttest
openat(AT_FDCWD, "./tls/haswell/x86_64/libssl.so.3", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
...
openat(AT_FDCWD, "test/sysdefault.cnf", O_RDONLY) = 3
1..1
ok 1 - test_func
    exited with 0    
 

Комментарии:

1. должен ли я использовать эти макросы внутри файла sysdefaulttest.c или мне следует сделать это в другом месте?

2. Я думаю, что обычно вы запускаете этот тест с использованием make TESTS="test_sysdefault" test , и в этом случае вам не нужно ничего делать, потому что при этом будет запущен 90-test_sysdefault.t рецепт, который устанавливает OPENSSL_CONF переменную среды sysdefault.cnf в значение, а этот файл конфигурации устанавливает минимальное и максимальное значение 1,2.

3. Если вы запустите тест напрямую, вы можете сделать то же самое: OPENSSL_CONF=sysdefault.cnf ./sysdefaulttest .

4. Можете ли вы сказать мне, где я могу узнать более подробно о процессе, о котором вы упомянули в своих двух предыдущих комментариях? Я не могу успешно запустить их.. должно быть, здесь не хватает некоторых деталей..

5. Извините, не знаю. В основном он искал файлы, содержащие «sysdefault» в их названии или в их содержимом, возможно, немного погуглил. Я обновил ответ, чтобы включить информацию из комментария. Я также добавил немного о «strace», который можно использовать для подтверждения открытия ожидаемого файла конфигурации.