Ошибка ORA-28040 no matching auth protocol решение

Ora 28040 no matching authentication protocol как исправить

Содержание статьи

Ora 28040 no matching authentication protocol как исправить

Ошибка ORA-28040: no matching authentication protocol возникает при попытке подключения к базе данных Oracle, когда клиент и сервер используют несовместимые версии протоколов аутентификации. Чаще всего проблема появляется после обновления Oracle Database до версии 11g, 12c, 18c или выше, при этом клиентские приложения продолжают работать на устаревших библиотеках Oracle Client, JDBC-драйверах или встроенных OCI-модулях.

На практике ORA-28040 проявляется при подключении через SQL*Plus, SQL Developer, JDBC-приложения, старые ERP-системы или сторонние инструменты резервного копирования. Сервер отклоняет соединение, поскольку минимально допустимая версия протокола аутентификации на стороне базы данных выше, чем та, которую поддерживает клиент. Сообщение об ошибке не указывает конкретный параметр, что затрудняет диагностику без понимания механизма аутентификации Oracle.

Ключевую роль в возникновении ошибки играют параметры SQLNET.ALLOWED_LOGON_VERSION_SERVER и SQLNET.ALLOWED_LOGON_VERSION_CLIENT, задаваемые в файле sqlnet.ora. Начиная с Oracle 12c, значения этих параметров по умолчанию повышены, что блокирует соединения с клиентами, использующими старые алгоритмы хеширования паролей. Это касается как локальных подключений, так и соединений по сети.

Для устранения ORA-28040 необходимо точно определить версию сервера, тип клиента и способ подключения, после чего выбрать корректный путь: обновление клиента, замена JDBC-драйвера или временная корректировка параметров sqlnet.ora. Неправильные изменения могут привести к снижению уровня защиты учетных записей, поэтому каждое решение должно быть привязано к конкретному сценарию эксплуатации базы данных.

Ошибка ORA-28040 no matching auth protocol: решение

Для устранения ошибки ORA-28040 требуется привести в соответствие поддерживаемые протоколы аутентификации на стороне сервера и клиента. Первым шагом необходимо определить версию базы данных командой select * from v$version; и версию клиента, используемого для подключения. Несовпадение чаще всего возникает при подключении клиентов Oracle 9i/10g к базам 11g и выше.

Если обновление клиента невозможно, допускается корректировка параметров в файле sqlnet.ora на сервере базы данных. Для этого добавляется или изменяется параметр SQLNET.ALLOWED_LOGON_VERSION_SERVER со значением 8 или 10, в зависимости от версии клиента. После внесения изменений требуется перезапуск listener и, при необходимости, экземпляра базы данных.

При подключении через JDBC следует заменить устаревший драйвер ojdbc14.jar или ojdbc6.jar на версию, соответствующую серверу, например ojdbc8.jar для Oracle 12c и выше. Использование старых драйверов приводит к попытке аутентификации по неподдерживаемому протоколу, что гарантированно вызывает ORA-28040.

В средах с SQL Developer ошибка устраняется обновлением самого инструмента, так как он включает встроенный Oracle Client. Использование старых версий SQL Developer с новыми базами данных приводит к отказу подключения даже при корректных учетных данных.

После временного ослабления параметров аутентификации рекомендуется запланировать переход на актуальные клиенты и вернуть значения SQLNET.ALLOWED_LOGON_VERSION_SERVER к значениям по умолчанию. Это исключает повторное появление ORA-28040 и снижает риск использования устаревших механизмов хранения и проверки паролей.

Причина ORA-28040 при подключении старых клиентов к Oracle

Причина ORA-28040 при подключении старых клиентов к Oracle

Ошибка ORA-28040 возникает, когда клиент Oracle использует версию протокола аутентификации, которая ниже минимально допустимой на стороне сервера. Начиная с Oracle Database 11g, а особенно в версиях 12c и выше, сервер по умолчанию запрещает использование старых схем проверки паролей, применявшихся в Oracle 9i и 10g.

Старые клиенты передают хеш пароля, сформированный алгоритмами, не поддерживающими усиленные требования к длине и криптографической стойкости. Сервер, получив такой запрос, не находит подходящий протокол согласования и прерывает соединение до этапа проверки учетных данных, что и приводит к ORA-28040.

Частым источником проблемы становятся встроенные клиенты в устаревших приложениях: ERP-системы, написанные под OCI 10g, старые версии SQL*Plus, а также JDBC-драйверы поколений ojdbc14 и ojdbc5. Даже при корректном имени пользователя и пароле подключение будет отклонено из-за несовместимости протоколов.

Дополнительным фактором является обновление базы данных без последующей проверки клиентской инфраструктуры. После установки патчей безопасности значения параметров аутентификации на сервере могут быть автоматически повышены, что мгновенно блокирует подключения старых клиентов без изменения их конфигурации.

Для точного подтверждения причины рекомендуется проверить параметры SQLNET.ALLOWED_LOGON_VERSION_SERVER в файле sqlnet.ora и сопоставить их с возможностями используемого клиента. Это позволяет однозначно установить, что ORA-28040 вызвана именно несовместимостью протоколов, а не ошибкой учетных данных или сетевой конфигурации.

Проверка версий Oracle Client и Oracle Database перед исправлением

Проверка версий Oracle Client и Oracle Database перед исправлением

Перед изменением параметров аутентификации необходимо точно определить версии Oracle Database и Oracle Client, участвующие в подключении. Без этого невозможно понять, какой протокол логина используется и почему сервер отклоняет соединение с ошибкой ORA-28040.

На стороне базы данных версия определяется выполнением запроса select banner from v$version;. Он позволяет увидеть не только основной релиз, но и уровень обновлений, так как патчи безопасности могут изменять допустимые версии протоколов аутентификации без явного уведомления администратора.

Версия Oracle Client зависит от способа подключения. Для SQL*Plus она отображается командой sqlplus -v, для приложений – по установленным библиотекам OCI или JDBC-драйверам. Частая ошибка – использование клиента 10g при работе с базой 12c, что гарантированно приводит к несовместимости протоколов.

Соответствие версий клиента и сервера определяет допустимый диапазон параметров SQLNET.ALLOWED_LOGON_VERSION_SERVER. Клиенты Oracle 9i требуют минимального значения 8, Oracle 10g – 10, тогда как базы 12c и выше по умолчанию ожидают более высокие значения и блокируют устаревшие схемы аутентификации.

Отдельное внимание следует уделить JDBC. Даже при актуальной версии базы приложение может использовать старый файл ojdbc14.jar, лежащий в classpath. Проверка версии драйвера выполняется по имени файла и его манифесту, а не по версии JDK.

После сопоставления версий становится ясно, требуется ли обновление клиента или допустима временная корректировка настроек sqlnet.ora. Пропуск этого этапа часто приводит к повторному появлению ORA-28040 после очередного обновления или перезапуска сервисов.

Настройка параметра SQLNET.ALLOWED_LOGON_VERSION_SERVER

Параметр SQLNET.ALLOWED_LOGON_VERSION_SERVER определяет минимальную версию протокола аутентификации, которую сервер Oracle принимает от клиентов. При значении выше возможностей клиента соединение прерывается с ошибкой ORA-28040 еще до проверки имени пользователя и пароля.

Настройка выполняется в файле sqlnet.ora, расположенном в каталоге $ORACLE_HOME/network/admin. При отсутствии параметра используется значение по умолчанию, зависящее от версии базы данных и установленных патчей безопасности.

  • 8 – разрешает подключения клиентов Oracle 9i и выше
  • 10 – допускает клиентов Oracle 10g и выше
  • 11 и выше – блокирует устаревшие клиенты и требует новых протоколов аутентификации

Для временного восстановления доступа старых приложений параметр добавляется или изменяется следующим образом: SQLNET.ALLOWED_LOGON_VERSION_SERVER=10. Это значение подходит для большинства клиентов 10g, но не решает проблему для более старых версий.

После изменения файла необходимо перезапустить Oracle Listener, так как новые параметры не применяются динамически. В отдельных конфигурациях с выделенным серверным процессом может потребоваться перезапуск экземпляра базы данных.

  1. Остановить listener командой lsnrctl stop
  2. Внести изменения в sqlnet.ora
  3. Запустить listener командой lsnrctl start

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

Изменение SQLNET.ALLOWED_LOGON_VERSION_CLIENT для совместимости

Изменение SQLNET.ALLOWED_LOGON_VERSION_CLIENT для совместимости

Параметр SQLNET.ALLOWED_LOGON_VERSION_CLIENT управляет минимальной версией протокола аутентификации, которую клиент Oracle готов использовать при установке соединения. Если значение выше, чем поддерживает сервер, подключение завершается ошибкой ORA-28040 на этапе согласования протоколов.

Изменение выполняется в файле sqlnet.ora на стороне клиента. Это актуально для рабочих станций, серверов приложений и batch-процессов, использующих OCI или SQL*Plus. При использовании JDBC параметр игнорируется, так как драйвер управляет аутентификацией самостоятельно.

Для совместимости с базами Oracle 10g и ниже значение параметра обычно устанавливается равным 10 или 8. Пример настройки: SQLNET.ALLOWED_LOGON_VERSION_CLIENT=10. Это заставляет клиент использовать старый протокол логина, понятный устаревшему серверу.

После изменения файла требуется перезапуск всех процессов, использующих Oracle Client. Открытые сессии продолжают работать с прежними параметрами и не наследуют новые значения.

Если параметр занижен на клиенте, а сервер настроен на прием только новых протоколов, соединение также будет отклонено. Поэтому настройка клиента должна выполняться только после проверки серверных ограничений в SQLNET.ALLOWED_LOGON_VERSION_SERVER.

Использование устаревших протоколов оправдано лишь при отсутствии возможности обновить сервер или приложение. В долгосрочной перспективе рекомендуется переход на актуальные версии клиентов и удаление параметра из конфигурации.

Правка файла sqlnet.ora: пошаговый разбор параметров

Файл sqlnet.ora управляет сетевыми и аутентификационными параметрами Oracle Net и напрямую влияет на появление ошибки ORA-28040. Перед внесением изменений необходимо определить, используется ли файл на сервере базы данных, на клиенте или в обоих местах, так как параметры обрабатываются независимо.

Первым шагом следует открыть sqlnet.ora в каталоге $ORACLE_HOME/network/admin и проверить наличие параметров SQLNET.ALLOWED_LOGON_VERSION_SERVER и SQLNET.ALLOWED_LOGON_VERSION_CLIENT. При их отсутствии применяются значения по умолчанию, которые в современных версиях Oracle блокируют старые протоколы аутентификации.

Для разрешения подключения устаревших клиентов в серверный файл добавляется строка SQLNET.ALLOWED_LOGON_VERSION_SERVER=10 или ниже, в зависимости от версии клиента. Значение должно соответствовать минимальной версии, необходимой для конкретного приложения, а не задаваться произвольно.

На стороне клиента при необходимости указывается SQLNET.ALLOWED_LOGON_VERSION_CLIENT, чтобы клиент не пытался использовать протокол, неподдерживаемый сервером. Этот параметр учитывается только для OCI и SQL*Plus и не влияет на JDBC-подключения.

После сохранения файла требуется перезапуск listener и всех процессов, использующих Oracle Net. Проверка выполняется повторной попыткой подключения и анализом сетевых логов, если ошибка сохраняется.

После восстановления доступа рекомендуется зафиксировать изменения и запланировать обновление клиентов. Постоянное использование заниженных значений в sqlnet.ora увеличивает риск эксплуатации устаревших механизмов аутентификации.

Исправление ORA-28040 при подключении через JDBC

При использовании JDBC ошибка ORA-28040 связана не с настройками sqlnet.ora на клиенте, а с версией JDBC-драйвера, который реализует собственный механизм аутентификации. Сервер отклоняет соединение, если драйвер не поддерживает требуемый протокол логина.

Наиболее частая причина – применение устаревших файлов ojdbc14.jar, ojdbc5.jar или ojdbc6.jar при подключении к Oracle Database 11g и выше. Такие драйверы формируют запрос аутентификации по старой схеме, которая заблокирована на сервере.

Для устранения ошибки необходимо заменить драйвер на версию, соответствующую серверу базы данных. Для Oracle 11g используется ojdbc6.jar или ojdbc7.jar, для 12c и выше – ojdbc8.jar. Файл должен быть единственным в classpath, так как наличие нескольких версий приводит к непредсказуемому выбору драйвера.

После обновления драйвера требуется перезапуск приложения или контейнера. В средах WebLogic, Tomcat и JBoss рекомендуется очистить кэш классов и проверить, что старая версия JDBC не загружается из общих библиотек.

Изменение параметров SQLNET.ALLOWED_LOGON_VERSION_SERVER на сервере допустимо только как временная мера, если обновление драйвера невозможно. При долгосрочной эксплуатации JDBC-приложений предпочтительно поддерживать версии драйверов на уровне, совместимом с текущими настройками безопасности базы данных.

Решение ORA-28040 в SQL Developer и других GUI-инструментах

В графических инструментах администрирования и разработки ошибка ORA-28040 почти всегда связана с использованием встроенного Oracle Client, версия которого не соответствует настройкам аутентификации на сервере базы данных. Пользовательские параметры sqlnet.ora в таких случаях не учитываются или имеют ограниченное влияние.

Для SQL Developer критично учитывать версию самого приложения, так как каждая сборка включает фиксированный набор библиотек Oracle. Подключение к Oracle Database 12c и выше из старых версий SQL Developer приводит к попытке логина по устаревшему протоколу.

  • Проверить версию SQL Developer через меню Help → About
  • Сравнить ее с версией базы данных
  • Обновить инструмент до версии, рекомендованной для используемого релиза Oracle

Если обновление невозможно, допускается привязка SQL Developer к внешнему Oracle Client через настройку Use Oracle Client. В этом случае используется установленный OCI, а не встроенные библиотеки.

  1. Установить совместимую версию Oracle Client
  2. Указать путь к клиенту в настройках SQL Developer
  3. Перезапустить приложение

Аналогичный подход применяется к другим GUI-инструментам: TOAD, PL/SQL Developer, DBeaver. Каждый из них либо использует встроенные драйверы, либо позволяет явно указать JDBC или OCI-библиотеки.

Снижение значения SQLNET.ALLOWED_LOGON_VERSION_SERVER для поддержки старых GUI-инструментов допустимо только при временной эксплуатации. Постоянное решение – использование актуальных версий клиентских инструментов, совместимых с текущими настройками базы данных.

Риски ослабления протоколов аутентификации и меры контроля

Снижение значений SQLNET.ALLOWED_LOGON_VERSION_SERVER или SQLNET.ALLOWED_LOGON_VERSION_CLIENT разрешает использование устаревших протоколов аутентификации, основанных на слабых алгоритмах хеширования паролей. В таких режимах сервер принимает учетные данные, совместимые с механизмами Oracle 9i и 10g, которые не соответствуют современным требованиям к защите учетных записей.

Основной риск заключается в возможности перехвата и подбора хеша пароля при наличии доступа к сетевому трафику или дампам памяти клиента. Даже при использовании сложных паролей устаревшие алгоритмы значительно упрощают офлайн-атаки на учетные записи базы данных.

Дополнительную угрозу представляет неконтролируемое подключение старых приложений. После ослабления параметров сервер не различает легитимные устаревшие клиенты и потенциально скомпрометированные инструменты, использующие старые протоколы для обхода ограничений.

Для минимизации рисков рекомендуется ограничивать срок действия заниженных параметров и фиксировать их использование в эксплуатационной документации. Параллельно следует контролировать активные подключения через представления v$session и v$process, выявляя клиенты с устаревшими версиями.

После обновления приложений и клиентов параметры аутентификации должны быть возвращены к строгим значениям. Это восстанавливает блокировку старых протоколов и исключает повторное появление ORA-28040 без необходимости жертвовать уровнем защиты базы данных.

Вопрос-ответ:

Почему ORA-28040 появляется сразу после обновления базы данных, хотя приложения не менялись?

После обновления Oracle Database автоматически применяются новые значения параметров аутентификации. Сервер начинает принимать только современные протоколы логина, а старые клиенты продолжают использовать прежние схемы передачи хеша пароля. В результате соединение блокируется до проверки учетных данных.

Можно ли исправить ORA-28040 без изменения sqlnet.ora на сервере?

Да, если источник ошибки — устаревший клиент. Обновление Oracle Client, JDBC-драйвера или GUI-инструмента устраняет проблему без изменения серверных настроек. Такой подход предпочтителен, так как не ослабляет требования к аутентификации.

Почему параметр SQLNET.ALLOWED_LOGON_VERSION_CLIENT не влияет на JDBC-подключения?

JDBC использует собственную реализацию аутентификации, встроенную в драйвер. Параметры sqlnet.ora на стороне клиента обрабатываются только OCI и SQL*Plus, поэтому при работе через JDBC решающим фактором остается версия файла ojdbc.

Как понять, какой именно клиент вызывает ORA-28040 при большом количестве подключений?

Нужно проанализировать активные сессии через представление v$session, обращая внимание на имя программы и хост. Это позволяет выявить приложения и инструменты, использующие устаревшие библиотеки и вызывающие ошибку.

Опасно ли временно снижать SQLNET.ALLOWED_LOGON_VERSION_SERVER ради старого приложения?

Риск связан с разрешением старых протоколов аутентификации, использующих слабые алгоритмы хеширования. При краткосрочном использовании и ограниченном доступе это допустимо, но такое решение требует планирования обновления клиента и возврата строгих настроек.

Почему ORA-28040 возникает только у части пользователей, хотя все подключаются к одной базе данных?

Причина связана с разными клиентскими компонентами. Одни пользователи могут работать через обновлённый SQL Developer или новый JDBC-драйвер, а другие — через старый Oracle Client, встроенный в приложение или установленный локально. Сервер применяет одинаковые требования ко всем, но несовместимость проявляется только у тех подключений, где клиент использует устаревший протокол аутентификации.

Ссылка на основную публикацию