Openssl: проверка сертификата завершается сбоем, когда в API SSL_CTX_load_verify_locations используется аргумент CApath

Я пытаюсь установить 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-интерфейсами библиотеки по какой-то неизвестной причине.

Может ли кто-нибудь сказать мне причину и, если возможно, решение этой проблемы?


person Sreeyesh    schedule 04.09.2015    source источник
comment
Имеют ли файлы в CApath правильные имена файлов (т. е. хэш сертификата), как описано в документации? Из openssl.org/docs/manmaster/ssl/: если CApath не NULL, он указывает на каталог, содержащий сертификаты ЦС в формате PEM. Каждый файл содержит один сертификат ЦС. Файлы ищутся по хеш-значению имени субъекта ЦС, которое, следовательно, должно быть доступно. ...   -  person Steffen Ullrich    schedule 04.09.2015
comment
Сертификат ЦС имеет имя субъекта (CN=‹IP-адрес›). Но я не понимаю, что подразумевается под хэшем имени субъекта. Я не вижу такого поля в сертификате.   -  person Sreeyesh    schedule 04.09.2015
comment
Ваш комментарий показывает, что ваши файлы, вероятно, не имеют правильного имени. Вы можете прочитать mta.openssl.org/pipermail/openssl-users /2015-July/001687.html для получения дополнительной информации о том, как создать правильное имя файла.   -  person Steffen Ullrich    schedule 04.09.2015
comment
@SteffenUllrich, это было действительно очень полезно. Спасибо   -  person Sreeyesh    schedule 07.09.2015


Ответы (1)


Я публикую ответ на свой вопрос, потому что я потратил много времени на поиск решения этой проблемы, так как я не получил слишком много информации по этой проблеме из Интернета. И я надеюсь, что это поможет кому-то еще, столкнувшемуся с подобной проблемой.

Если CApath не равен нулю, каталог, на который указывает CApath, должен содержать действительные сертификаты CA. И самое главное, имя файла CA должно быть хэш-значением имени субъекта.

Либо файлы ЦС могут быть переименованы в значения хэша их имен субъектов, либо программные ссылки на файлы ЦС могут быть созданы с именем, совпадающим с хэшем имен субъектов ЦС файлов ЦС.

c_rehash можно использовать для создания необходимых ссылок в CApath. Синтаксис этой команды довольно прост.

c_rehash <CApath>

Утилита c_rehash может быть доступна не во всех дистрибутивах Linux. В этом случае

openssl x509 -in <CA file name> -noout -subject_hash

может использоваться для генерации хэша имени субъекта (например, e5d93f80). Просто добавьте «.0» к этому значению и создайте программную ссылку с этим именем (e5d93f80.0) на файл CA. Если существует более одного файла CA с одинаковым хеш-значением имени субъекта, их расширения должны быть разными (например, e5d93f80.1). Поиск выполняется в порядке добавочного номера.

opensssl представил эту технику, чтобы сократить время поиска файла CA. В противном случае openssl, возможно, придется прочитать все файлы в CApath, чтобы найти соответствующий файл CA.

person Sreeyesh    schedule 08.09.2015