Переименование криптобиблиотеки не починит старый клиент
Символическая ссылка меняет то, какой файл откроет загрузчик, а не интерфейс, под который собран бинарный файл. Проверьте тип сбоя, прежде чем трогать какую-либо библиотеку.
Разберите ошибку загрузчика по порядку: какого файла нет, какую архитектуру использует бинарный файл, какой символ ему был нужен и случился ли сбой до или после запуска процесса. Это четыре разные проблемы, и символическая ссылка решает только первую. Выполнение их по порядку предотвращает обычный исход, когда клиент запускается и затем падает на первом рукопожатии. Контрольный список заканчивается проверкой через настоящий загрузчик, а не ручным тестом.
Прежде чем что-либо менять, дословно запишите путь к исполняемому файлу, его архитектуру и текст первой ошибки.
Четыре разных сбоя за одной ошибкой
Отсутствующий общий объект — это проблема поиска файла: загрузчик искал имя и ничего не нашёл. Отсутствующий символ — это проблема интерфейса: файл существует и не экспортирует то, на что ссылается бинарный файл. Несовпадение версии символа — тот же класс с большей детализацией. Неподдерживаемый алгоритм, о котором сообщают после запуска, — это изменение поведения внутри библиотеки, которая успешно загрузилась. Каждый требует своего ответа, и только первый — вопрос имени.
ldd по бинарному файлу и readelf -d по его динамической секции показывают, что он требует, и этого обычно достаточно, чтобы отделить проблему файла от проблемы интерфейса.
Что на самом деле требует OpenSSL 3
Руководство по переходу на OpenSSL 3 прямо об этом говорит: приложения, собранные под прежние версии, нуждаются как минимум в перекомпиляции, а совместимость исходного кода не гарантируется. Интерфейсы изменились, некоторые устарели или были удалены. Псевдоним имени файла не может выполнить перекомпиляцию и не может научить старый бинарный файл новому интерфейсу. Компоновка более новой библиотеки под старомодным именем даёт программу, которая может запуститься и затем отказать в куда менее очевидном месте.
Это хуже чистого сбоя. Ошибка загрузчика сразу называет проблему, тогда как поздний сбой внутри операции выглядит как проблема сети или учётных данных и уводит расследование в неверную сторону.
Почему библиотека дистрибутива — неподходящее место
Замена библиотеки дистрибутива ради одного клиента меняет окружение для каждой программы на машине, включая обновления безопасности и всё, что опирается на существующий интерфейс. Копирование старой библиотеки рядом с бинарным файлом уже, но всё равно создаёт зависимость, которую кто-то должен сопровождать и латать. Ни то, ни другое не является одобренным путём совместимости, даже если в день применения кажется, что это работает. Глобальный псевдоним, оставленный после эксперимента, хуже, потому что никто не помнит, зачем он существует.
Используйте поддерживаемый поставщиком клиент и набор зависимостей для фактического выпуска ОС, архитектуры и шлюза. Формат пакета, который сработал у одного человека, не устанавливает правильный текущий путь, а архивный рецепт — свидетельство о прошлом.
Проверяйте загрузчик, а не запуск
После поддерживаемой замены проверьте, что разрешает обычный загрузчик: ldd по установленному исполняемому файлу, версии библиотек, которые он называет, и окружение, которое передаёт служба. Затем выполните предполагаемую аутентификацию и одну реальную операцию. Ручной вызов с изменённым окружением доказывает лишь то, что ваша оболочка умеет его запускать. Пользователи на деле запускают загрузчик, запись рабочего стола или юнит службы.
Если поддерживаемой сборки нет, спросите владельца VPN об альтернативе или пути миграции. Молчаливый переход на другой протокол или предположение, что клиент с известным именем поставщика удовлетворяет шлюз, переносит сбой вместо того, чтобы его исправить.
Там, где временное решение совместимости неизбежно, задокументируйте его, ограничьте тем самым бинарным файлом и удалите, когда появится поддерживаемая сборка.