Я пытаюсь установить TLS-соединение с сервером. Я создал корневой сертификат CA и сертификат сервера, используя команды CLI openssl. Я создал сертификат сервера с общим именем, таким же, как его IP-адрес. Обычное имя корневого сертификата ЦС — это полное доменное имя сервера.
Я использую API-интерфейсы библиотеки openssl для установления соединения с сервером. Я использую API
int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, const char *CApath)
для установки пути поиска файла CA.
Все работает нормально, когда я использую аргумент CAfile для указания пути к моему файлу CA, оставляя аргумент CApath равным NULL.
Но если я использую аргумент CApath, чтобы указать путь к каталогу, содержащему файлы CA, оставив аргумент CAfile равным NULL, соединение не будет установлено из-за ошибки проверки сертификата.
Когда я захватил пакеты с помощью wireshark, я обнаружил, что мой клиентский код отправляет ответ TLS «Неизвестный ЦС» для «серверного приветствия» с сервера. Я использовал тот же файл сертификата ЦС, что и при успешном подключении.
Из моих наблюдений при изучении исходного кода библиотеки openssl я делаю вывод, что в моем случае файлы CA не считаются действительными и, следовательно, не загружаются API-интерфейсами библиотеки по какой-то неизвестной причине.
Может ли кто-нибудь сказать мне причину и, если возможно, решение этой проблемы?