Гид по технологиям

Ошибка cannot generate SSPI context в SQL Server

6 min read SQL Server Обновлено 30 Nov 2025
Не удаётся создать SSPI контекст в SQL Server
Не удаётся создать SSPI контекст в SQL Server

Схема: ошибка cannot generate SSPI context при подключении к SQL Server

Ошибка «The target principal name is incorrect — cannot generate SSPI context» в SQL Server появляется при попытке установить соединение с удалённого хоста с использованием учётной записи Windows. Это общий сигнальный текст, который может маскировать несколько причин: некорректный или устаревший пароль, рассинхронизация часов, неправильно зарегистрированный SPN, или отсутствие прав на доступ к Active Directory.

Ниже — упрощённый план действий, подробные инструкции и дополнения для разных ролей (DBA, администратор AD, служба поддержки).

Причины и признаки

  • Неправильный или просроченный пароль учётной записи сервиса SQL.
  • Отсутствие или дублирование SPN (Service Principal Name) для сервиса MSSQL.
  • Проблемы с Kerberos (какие-то билеты недействительны). Используется NTLM вместо Kerberos.
  • Рассинхронизация времени между сервером SQL и контроллерами домена (drift часов).
  • Нехватка прав у учётной записи сервиса для регистрации SPN.
  • Проблемы с кэшем билетов на клиенте или сервере.

Важно: само сообщение об ошибке не указывает однозначную причину — нужно прогнать проверочный список.

Быстрая проверка (5 минут)

  1. Попробуйте подключиться под локальной учётной записью SQL (не Windows) — если работает, проблема в Kerberos/AD.
  2. На сервере SQL выполните перезапуск сервисов SQL Server и SQL Server Agent — иногда помогает временно.
  3. На клиенте и сервере проверьте системное время и часовой пояс. Разница >5 минут может привести к ошибке Kerberos.
  4. Выполните klist purge на клиенте и/или сервере, чтобы очистить кэш Kerberos-билетов.

Пошаговое устранение

1. Проверка и изменение учётной записи службы SQL

Если служба SQL запускается под учётной записью домена, убедитесь, что у этой учётной записи есть право регистрировать SPN, либо используйте учётную запись с такими правами на время диагностики.

  • Временно можно сменить учётную запись сервиса на учётную запись, имеющую права Domain Admin, выполнить необходимые операции с SPN, а затем вернуть минимально необходимые права. При этом помните про принцип минимальных привилегий.

Шаги для удаления/проверки SPN через Active Directory Users and Computers:

  1. Откройте Active Directory Users and Computers в расширенном виде.

Снимок окна Active Directory Users and Computers, расширенный режим

  1. Найдите записи servicePrincipalName для учётной записи MSSQL Service.
  2. Удалите некорректные или дублирующиеся записи MSSQLSvc.
  3. Закройте консоль и попробуйте подключиться снова.

Дополнительно: управлять SPN можно через setspn. Примеры:

# Показать зарегистрированные SPN для учётной записи
setspn -L DOMAIN\SqlServiceAccount

# Удалить конкретный SPN
setspn -D MSSQLSvc/sqlserver.domain.local:1433 DOMAIN\SqlServiceAccount

# Зарегистрировать SPN безопасно (проверяет дубли)
setspn -S MSSQLSvc/sqlserver.domain.local:1433 DOMAIN\SqlServiceAccount

Примечание: используйте -S, чтобы setspn проверял на дублирование перед созданием.

2. Проверка пароля и состояния учётной записи

Ошибка часто возникает из‑за того, что пароль учётной записи службы был изменён, а служба не была перезапущена. Также возможен сценарий с истёкшим паролем.

Действия:

  • Выйдите и снова войдите в систему под соответствующей учётной записью (если это интерактивная сессия).
  • Проверьте в AD, не истёк ли пароль, и при необходимости смените/обновите его.
  • После смены пароля перезапустите службы SQL Server, чтобы они использовали новые креденшалы.

3. Изменение прав в Active Directory через ADSIEdit

Если сервисная учётная запись не может записать SPN в AD, можно скорректировать права доступа для неё через ADSIEdit:

  1. Запустите adsiedit.msc через окно Выполнить.

Окно ADSIEdit.msc с деревом домена

  1. В дереве разверните Domain [YourDomainName] → DC=RootDomainName → CN=Users.
  2. Найдите CN=[YourAccountName] → Свойства → Security (Безопасность) → Advanced (Дополнительно).
  3. Выберите любую запись SELF → Edit → Open Permission Entry.
  4. Убедитесь, что Principal = SELF, Type = Allow, Applied to = This object only.
  5. В списке прав включите Read servicePrincipalName и Write servicePrincipalName.
  6. Примените изменения и закройте.
  7. Перезапустите сервисы SQL, связанные с этой учётной записью.

Важно: изменение прав в AD следует делать осторожно и только после подтверждения, что проблема действительно в правах.

4. Проверка Kerberos и билетов

  • На клиенте и на сервере выполните:
klist purge
klist tickets
  • Проверьте, используется ли Kerberos или NTLM для подключения. В логах SQL Server ищите упоминания о Kerberos.
  • Если Kerberos не используется, проверьте корректность SPN и его отсутствие в дублирующем виде.

5. Дополнительные проверки сети и DNS

  • Убедитесь, что DNS возвращает правильные A/AAAA записи и что имя сервера совпадает с тем, которое используется в SPN.
  • Избегайте подключения по CNAME, если SPN зарегистрирован под реальным именем хоста. Для CNAME может потребоваться дополнительная настройка SPN.

Команды и сценарии диагностики (шпаргалка)

  • Список SPN для учётной записи:
setspn -L DOMAIN\SqlServiceAccount
  • Поиск дублей SPN (можно выполнить на контроллере домена):
setspn -X
  • Очистка Kerberos-кэша и просмотр билетов:
klist purge
klist tickets
  • Проверить, кто зарегистрировал SPN (через AD или командой setspn -L):
setspn -L SqlServiceAccount

Примеры, когда предложенные меры не помогут

  • Если проблема вызвана аппаратным сбоем сети или проблемами контроллера домена (AD недоступен) — локальные изменения в учётных записях не исправят ситуацию.
  • Если используется сторонний балансировщик или прокси, который изменяет имя назначения (SNI) — нужно настраивать SPN и на стороне балансировщика.
  • Если доменная архитектура смешанная и есть рестрикции на запись SPN, понадобятся изменения на уровне политики безопасности AD.

Роль‑ориентированные чек-листы

DBA:

  • Проверить логи SQL Server (ошибки аутентификации).
  • Перезапустить службы SQL после изменений учётной записи.
  • Проверить зарегистрированные SPN через setspn.

Администратор Active Directory:

  • Проверить права записи servicePrincipalName для учётной записи службы.
  • Устранить дубли SPN.
  • Проверить репликацию AD и доступность контроллеров домена.

Служба поддержки/Helpdesk:

  • Проверить дату/время на клиенте и сервере.
  • Очистить Kerberos-кэш на клиенте.
  • Собрать логи и передать DBA/AD-администратору.

Пошаговый план действий (SOP)

  1. Быстрая проверка времени и перезапуск служб.
  2. Проверка состояния учётной записи сервиса (пароль, блокировка, срок действия).
  3. Просмотр и коррекция SPN (setspn).
  4. При необходимости временно дать право на регистрацию SPN, выполнить настройку и вернуть минимальные права.
  5. Проверить Kerberos-билеты и перезапустить сервисы.
  6. Тестирование подключения и мониторинг логов в течение времени простоя.

Диагностическое дерево

flowchart TD
  A[Начало: ошибка SSPI] --> B{Подключение под SQL auth?}
  B -- Да --> C[Проблема с Windows auth — временно используйте SQL auth]
  B -- Нет --> D[Проверить время]
  D --> E{Часы синхронизированы?}
  E -- Нет --> F[Синхронизировать время, перезапустить сервисы]
  E -- Да --> G[Проверить пароль и статус учётной записи]
  G --> H{Пароль/активен?}
  H -- Нет --> I[Сбросить пароль, перезапустить сервисы]
  H -- Да --> J[Проверить SPN 'setspn']
  J --> K{SPN корректен и уникален?}
  K -- Нет --> L[Удалить/создать SPN, перезапустить сервисы]
  K -- Да --> M[Проверить Kerberos билеты 'klist']
  M --> N{Билеты валидны?}
  N -- Нет --> O[Очистить кэш, получить новый билет]
  N -- Да --> P[Если всё верно — обратиться к AD/инфраструктуре]

Критерии приёмки

  • Удалось подключиться к SQL Server с учётной записью Windows без ошибки cannot generate SSPI context.
  • SPN зарегистрирован корректно и не дублируется.
  • Билеты Kerberos доступны и валидны (klist tickets показывает соответствующие записи).
  • Нет рассинхронизации времени между серверами и контроллерами домена.

Итог и рекомендации

Ошибка cannot generate SSPI context обычно решается последовательной диагностикой: проверить время, пароли, права в AD и SPN. Начните с простых шагов (время, перезапуск, очистка билетов), затем проверьте SPN и права через setspn и ADSIEdit. Если вы не уверены в правах, привлеките администратора AD — изменение прав без понимания последствий может нарушить безопасность.

Если после всех шагов проблема остаётся, соберите логи SQL Server и дамп сетевых вызовов и передайте их команде AD/инфраструктуры.

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

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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Задержка в Routines Google Assistant
Гайды

Задержка в Routines Google Assistant

Вход по отпечатку пальца в Ubuntu
Безопасность

Вход по отпечатку пальца в Ubuntu

Cloudinary: хостинг изображений и интеграция в React
DevOps

Cloudinary: хостинг изображений и интеграция в React

Исправление ошибки SCCM 0x87D00607
SCCM

Исправление ошибки SCCM 0x87D00607

Скачивание торрентов через Terminal на Mac
Руководство

Скачивание торрентов через Terminal на Mac

Как изменить яркость экрана на iPhone или iPad
Гаджеты

Как изменить яркость экрана на iPhone или iPad