SQL Server не может начинаться с того, когда сервер настроен на использование SSL
В этой статье приведено разрешение ошибки 17182 (Сбой инициализации TDSSNIClient с ошибкой 0xd, код состояния 0x38), которая возникает при настройке сервера для использования SSL.
Применяется к: SQL Server
Исходный номер базы знаний: 2023869
Симптомы
Рассмотрим следующий сценарий:
У вас есть экземпляр SQL Server 2005 или более поздняя версия, размещенная в системе под управлением Windows Server 2008 или более поздней версии операционной системы.
Вы настроили шифрование SSL для SQL Server вручную, введя отпечаток сертификата в значение сертификата в следующем разделе реестра:
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\<instance>\MSSQLServer\SuperSocketNetLib
В этом сценарии запуск SQL Server может завершиться ошибкой, а следующие сообщения записываются в журнал ошибок SQL Server:
<Ошибка сервера Datetime> : 17182, серьезность: 16, состояние: 1.
<Сбой инициализации TDSSNIClient сервера Datetime> с ошибкой 0xd, кодом состояния 0x38.
<Ошибка сервера Datetime> : 17182, серьезность: 16, состояние: 1. <Сбой инициализации TDSSNIClient сервера Datetime> с ошибкой 0xd, кодом состояния 0x1.
<Ошибка сервера Datetime> : 17826, серьезность: 18, состояние: 3.
<Сервер Datetime> Не удалось запустить сетевую библиотеку из-за внутренней ошибки в сетевой библиотеке. Для определения причины проанализируйте ошибки, непосредственно предшествующие этой ошибке в журнале ошибок.
<Ошибка сервера Datetime> : 17120, серьезность: 16, состояние: 1.
<Не удалось запустить поток FRunCM в datetime> Server SQL Server. Проверьте в журнале ошибок SQL Server и журнале событий Windows сведения о возможных проблемах, связанных с этой ошибкой.
Причина
Распространенный основной причиной этих симптомов является невидимый символ, который, возможно, был непреднамеренно добавлен в значение отпечатка сертификата, когда он копируется из элемента управления с расширенным редактированием сертификатов в MMC.
Решение
Вы можете использовать любое из следующих разрешений:
Избегайте копирования ведущих символов из оснастки "Сертификаты" в MMC при копировании значения отпечатка сертификата.
Используйте средство Certutil вместо оснастки сертификатов в MMC для экспорта сертификата в текстовый файл, а затем скопируйте значение отпечатка необходимого сертификата из текстового файла. Ниже показано использование:
Чтобы просмотреть содержимое хранилища сертификатов текущего пользователя компьютера, введите следующее в командной строке:
certutil -store -user my
Чтобы просмотреть содержимое хранилища сертификатов локального компьютера, введите следующее в командной строке:
certutil -store my
Выходные данные приведенной выше команды можно направить в текстовый файл, используя следующую команду в административной командной строке в операционных системах на основе Vista:
certutil -store my > cert.txt
Отпечаток можно найти в строке, которая начинается с хэша сертификатов (sha1)
Например: Cert Hash(sha1): e7 02 4b 42 c4 04 fd 44 8c ec 21 f1 91 76 5c b7 c3 ad 1d 55
Затем можно скопировать это значение (без пробелов — в приведенном выше примере оно будет иметь значение e7024b42c404fd448cec21f191765cb7c3ad1d55) в значение сертификата под следующим разделом реестра:
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\<instance>\MSSQLServer\SuperSocketNetLib
Дополнительная информация
Код состояния 0x38 в сообщении об ошибке 17182 означает, что SQL Server испытал ошибку во время инициализации SSL. Дополнительные сведения см . в протоколах SQL.
Возвращаемый код 0xd обозначает ошибку ОС 0xd (13), которая преобразуется в "Недопустимые данные" Приведенная выше ошибка 17182 "Сбой инициализации TDSSNIClient с ошибкой 0xd, код состояния 0x38" происходит специально из-за того, что строка под значением сертификата не может быть правильно преобразована обратно в допустимый отпечаток сертификата.
Эта проблема с графическим интерфейсом с оснасткой "Сертификаты" не возникает в более ранних версиях Windows (например, Windows XP, Windows Server 2003), так как они не используют расширенный элемент управления редактированием в оснастке "Сертификаты"
Чтобы проверить, возникла ли проблема, описанная в этой статье, можно использовать следующую процедуру:
Откройте regedit и перейдите к следующему разделу реестра и экспортируйте ключ в файл SSLKey.reg:
HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\<instance>\MSSQLServer\SuperSocketNetLib
Откройте файл SSLKey.reg из шага 1 с помощью блокнота и диалогового окна "Сохранить как" в меню "Файл", щелкните ANSI в списке кодирования и нажмите кнопку "Сохранить".
Если вы получите предупреждение ниже, перейдите к шагу 3, нажав кнопку "ОК".
Предупреждение
Этот файл содержит символы в формате Юникода, который будет потерян при сохранении этого файла в виде текстового файла в кодировке ANSI. Чтобы сохранить сведения Юникода, нажмите кнопку "Отмена " ниже, а затем выберите один из параметров Юникода в раскрывающемся списке "Кодировка". Продолжать?
Закройте файл SSLKey.reg и снова откройте его с помощью Блокнота.
Если вы увидите знак вопросов или любой другой недопустимый символ в отпечатке сертификата, это означает, что вы, вероятно, работаете с проблемой, описанной в этой статье:
Пример записи может выглядеть примерно так:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib]
"Certificate"="?b009d02038431da332f095b4ea6a126f4f5c7d18"