Шифрование трафика между SQL Server и клиентом. Ответ на домашнее задание.
В прошлой серии мы подключили к SQL Server (см. Рис. 4 прошлой серии) созданный при помощи makecert тестовый сертификат (см. Рис.2 позапрошлой серии), который может использоваться для шифрования соединений.
Убейте его. Это можно сделать из mmc (Рис.4 - 6 позапрошлой серии) или при помощи утилиты certutil.exe. В моем случае подключенный к SQL Server сертификат имеет хэш 4be7e1058270206f23649235c7096fa8dad96a85, поэтому я напишу в окне командной строки
certutil . exe - delstoreMy4be7e1058270206f23649235c7096fa8dad96a85
Рис.1
Черное дело сделано. Перезапускаем SQL Server.
Рис.2
Е-мое! SQL Server не стартует. Event Viewer в системном логе пишет: The SQL Server (MSSQLSERVER) service terminated with service-specific error %%-2146885628.
Рис.3
А в Application Log:
SQL Server could not spawn FRunCM thread. Check the SQL Server error log and the Windows event logs for information about possible related problems.
Could not start the network library because of an internal error in the network library. To determine the cause, review the errors immediately preceding this one in the error log.
TDSSNIClient initialization failed with error 0x80092004, status code 0x1. Reason: Initialization failed with an infrastructure error. Check for previous errors. Cannot find object or property.
TDSSNIClient initialization failed with error 0x80092004, status code 0x80. Reason: Unable to initialize SSL support. Cannot find object or property.
Unable to load user-specified certificate [Cert Hash(sha1) "4BE7E1058270206F23649235C7096FA8DAD96A85"]. The server will not accept a connection. You should verify that the certificate is correctly installed. See "Configuring Certificate for Use by SSL" in Books Online.
Фигасе, как он обиделся, что у него отобрали сертификат.
Рис.4
Лечится это очень просто. Зайдите в SQL Server Configuration Manager и выберите для SQL Server Network Configuration \ Protocols for <Имя инстанса> какой-нибудь другой сертификат - см. Рис.4 предыдущего поста. Либо нажмите кнопку Clear, чтобы он вообще не использовал никаких сертификатов. Эти действия оперируют над ключом реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQLServer\SuperSocketNetLib по имени Certificate. В случае именованного экземпляра вместо MSSQL10_50.MSSQLSERVER может использоваться имя этого экземпляра. Соответствие имен экземпляров и путей в реестре находится в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL. Короче, вместо SQL Server Configuration Manager при желании я его могу задать используемый экземпляром сертификат напрямую. Сейчас там значится удаленный сертификат, который SQL Server не находит и отказывается работать:
Рис.5
Я могу вбить туда хэш оставшегося сертификата A5D81C78E91888993033FD3EBBA76E65733A6696 - см. Рис.1, 2 предыдущего поста. Это действие эквивалентно выбору сертификата из комбобокса в SQL Server Configuration Manager. Я могу вообще очистить сертификат:
Рис.6
Это действие эквивалентно нажатию кнопки Clear. SQL Server читает значения из реестра при старте, поэтому требуется (пере)запустить SQL Server, чтобы они вступили в силу. Можно видеть, что на этот раз старт сервиса проходит нормально.
Алексей Шуленин, Microsoft