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 заносятся следующие сообщения:

<Ошибка сервера даты и времени> : 17182, серьезность: 16, состояние: 1.
<Сбой инициализации сервера TDSSNIClient даты и времени> с ошибкой 0xd, код состояния 0x38.
<Ошибка сервера даты и времени> : 17182, серьезность: 16, состояние: 1. <> Сбой инициализации сервера TDSSNIClient с ошибкой 0xd, код состояния 0x1.
<Ошибка сервера даты и времени> : 17826, серьезность: 18, состояние: 3.
<Серверу Datetime> не удалось запустить сетевую библиотеку из-за внутренней ошибки в сетевой библиотеке. Чтобы определить причину, просмотрите ошибки, непосредственно предшествующие этой, в журнале ошибок.
<Ошибка сервера даты и времени> : 17120, серьезность: 16, состояние: 1.
<SQL Server сервера даты и времени> не удалось создать поток FRunCM. Сведения о возможных связанных проблемах см. в журнале ошибок 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

Затем можно скопировать это значение (без пробелов — в приведенном выше примере оно будет e7024b42c404fd448cec21f1765cb7c3ad1d55) в значение Certificate в следующем разделе реестра:

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

Дополнительная информация

Код состояния 0x38 в сообщении об ошибке 17182 означает, что во время инициализации SSL SQL Server произошла ошибка. Дополнительные сведения см. в статье Протоколы 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"