Поделиться через


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), так как они не используют расширенный элемент управления редактированием в оснастке "Сертификаты"

Чтобы проверить, возникла ли проблема, описанная в этой статье, можно использовать следующую процедуру:

  1. Откройте regedit и перейдите к следующему разделу реестра и экспортируйте ключ в файл SSLKey.reg:

    HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\<instance>\MSSQLServer\SuperSocketNetLib

  2. Откройте файл SSLKey.reg из шага 1 с помощью блокнота и диалогового окна "Сохранить как" в меню "Файл", щелкните ANSI в списке кодирования и нажмите кнопку "Сохранить".

  3. Если вы получите предупреждение ниже, перейдите к шагу 3, нажав кнопку "ОК".

    Предупреждение

    Этот файл содержит символы в формате Юникода, который будет потерян при сохранении этого файла в виде текстового файла в кодировке ANSI. Чтобы сохранить сведения Юникода, нажмите кнопку "Отмена " ниже, а затем выберите один из параметров Юникода в раскрывающемся списке "Кодировка". Продолжать?

  4. Закройте файл SSLKey.reg и снова откройте его с помощью Блокнота.

  5. Если вы увидите знак вопросов или любой другой недопустимый символ в отпечатке сертификата, это означает, что вы, вероятно, работаете с проблемой, описанной в этой статье:

    Пример записи может выглядеть примерно так:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\MSSQLServer\SuperSocketNetLib]
    "Certificate"="?b009d02038431da332f095b4ea6a126f4f5c7d18"