Каковы конкретные шаги для установки подписанного CLR хранимого процесса в SQL? - PullRequest
1 голос
/ 12 августа 2011

Это преследует меня уже 2 дня.У меня есть CLR sp, который нуждается в EXTERNAL_ACCESS.Я могу развернуть его через VS2010 на своем компьютере разработчика, установив TRUSTWORTHY ON, но мы не хотим делать это на рабочем сервере.Мы приобрели сертификат, совместимый с AuthentiCode, и я попытался подписать свою сборку этим, но это не удалось из-за цепочки, поэтому я следовал инструкциям , подробно изложенным здесь, чтобы удалить цепочку из сертификата .

Затем я попытался подписать сборку в VS, но получил сообщение об ошибке «Была сделана попытка сослаться на токен, который не существует.»

Итак, перешел в командную строку и подписал сборку с помощьюСнятие цепочки с сертификата с использованием SignTool.exe, как рекомендовали несколько блоггеров.Утилита сообщает, что подписывание выполнено успешно.

Теперь нужно импортировать сборку в SQL Server (Express 2008R2) на моем компьютере разработчика.Сначала отключите TRUSTWORTHY, так как эту процедуру придется применить к производственному серверу.Затем я запускаю

   CREATE ASSEMBLY SqlClrProcedures from 'c:\<snip>\SqlClrProcedures.dll'
   WITH PERMISSION_SET = EXTERNAL_ACCESS

Получается следующая ошибка: * CREATE ASSEMBLY для сборки 'SqlClrProcedures' не выполнен, поскольку сборка 'SqlClrProcedures' не авторизована для PERMISSION_SET = EXTERNAL_ACCESS.Сборка авторизуется, если выполняется одно из следующих условий: владелец базы данных (DBO) имеет разрешение EXTERNAL ACCESS ASSEMBLY, а база данных имеет свойство базы данных TRUSTWORTHY;или сборка подписана сертификатом или асимметричным ключом, который имеет соответствующий логин с разрешением EXTERNAL ACCESS ASSEMBLY. *

Я вошел в систему как sa.Итак, я создаю пользователя, назначаю ему владение базой данных и предоставляю ему ВНЕШНИЙ ДОСТУП:

GRANT EXTERNAL ACCESS Assembly to ClrLogin

Затем попробуйте

CREATE ASSEMBLY SqlClrProcedures AUTHORIZATION ClrLogin from 'c:\<snip>\SqlClrProcedures.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS

, который выдает ту же ошибку выше.

dbo был предоставлен EXTERNAL ACCESS ASSEMBLY, и сборка подписана, но я не понимаю часть о соответствующем входе в систему. Нужна ли учетная запись для сертификата?

Если установить TRUSTWORTHY ON только дляПройдите CREATE ASSEMBLY, сборка импортируется нормально, но когда я запускаю sp, я получаю эту ошибку:

An error occurred in the Microsoft .NET Framework while trying to load assembly id 65573. The server may be running out of resources, or the assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or UNSAFE. Run the query again, or check documentation to see how to solve the assembly trust issues. For more information about this error: 
System.IO.FileLoadException: Could not load file or assembly 'sqlclrprocedures, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An error relating to security occurred. (Exception from HRESULT: 0x8013150A)
System.IO.FileLoadException: 
   at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
   at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.Load(String assemblyString)

, поэтому кажется, что сертификат не распознается.Может кто-нибудь подсказать, пожалуйста, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 26 августа 2011

В Kent Tegels есть пошаговый пример , показывающий процесс безопасности для подписи сборки clr сертификатом, а затем загрузки сертификата на сервер, так что сборка считается доверенной.

0 голосов
/ 16 марта 2018
  1. Правильно, TRUSTWORTHY следует установить на OFF. Для получения дополнительной информации, пожалуйста, смотрите мой пост: ПОЖАЛУЙСТА, пожалуйста, пожалуйста, прекратите использование олицетворения, TRUSTWORTHY и цепочки владения кросс-БД

  2. Подписание сборки в Visual Studio означает применение ключа строгого имени; не позволяет подписывать сертификатом (к сожалению).

  3. Поскольку вы собираетесь использовать подписанную сборку, вам не нужно беспокоиться о том, что владелец базы данных (dbo) связан с именем входа, которому было предоставлено либо разрешение EXTERNAL ACCESS ASSEMBLY, либо UNSAFE ASSEMBLY ( сообщение об ошибке указывает, что разрешение dbo имеет значение только тогда, когда TRUSTWORTHY равно ON). При использовании подписанной сборки именно логин, созданный из асимметричного ключа или сертификата (который использовался для подписи сборки), получает разрешение EXTERNAL ACCESS ASSEMBLY или UNSAFE ASSEMBLY.

  4. Вам не нужно AUTHORIZATION ClrLogin часть

  5. Что вам нужно (или нужно) сделать:

    1. Создать сертификат в базе данных master. Вы можете создать сертификат несколькими различными способами:

      • Уже загруженная SAFE сборка (это будет опция FROM ASSEMBLY). ОДНАКО благодаря изменениям, внесенным в SQL Server 2017, это больше не вариант.
      • Файл .cer (т.е. открытый ключ) из файловой системы (это будет опция FROM FILE)
      • Файл .dll из файловой системы (это будет опция FROM EXECUTABLE FILE)
      • Файл .cer непосредственно из литерала VARBINARY (это будет опция FROM BINARY). Чтобы легко преобразовать этот файл в шестнадцатеричную байтовую строку (т. Е. 0x12AB00003D...), вы можете использовать утилиту командной строки с открытым исходным кодом BinaryFormatter , которую я написал и которая может быть использована в автоматизации / непрерывной интеграции (путем ее преобразования). в файл, который нужно импортировать / включить), или использовать для ручного написания сценария оператора CREATE CERTIFICATE (путем преобразования его непосредственно в буфер обмена для вставки в сценарий).
    2. Создать логин из этого сертификата
    3. Предоставьте этой учетной записи разрешение EXTERNAL ACCESS ASSEMBLY или UNSAFE ASSEMBLY (начиная с SQL Server 2017, только разрешение UNSAFE ASSEMBLY).

Относительно SQL Server 2017

В SQL Server 2017 появилась новая функция безопасности («строгая защита CLR», расширенный параметр), которая включена по умолчанию и требует, чтобы ВСЕ сборки, даже помеченные как SAFE, были подписаны либо асимметричным ключом (т. Е. строгое имя) или сертификат и иметь логин (на основе того, что использовалось для подписи сборки), который имеет разрешение UNSAFE ASSEMBLY Для получения подробной информации о том, как заставить это работать, с или без Visual Studio / SSDT, пожалуйста, смотрите мои следующие два сообщения:

Пожалуйста, избегайте новой «функции» Trusted Assemblies, поскольку она имеет гораздо больше недостатков, чем преимуществ, не говоря уже о том, что она, во-первых, совершенно не нужна, учитывая, что существующая функциональность уже справилась с ситуацией, которую «Trusted Assemblies» должна была решить. Для получения полной информации об этом и демонстрации правильного способа обработки существующих неподписанных сборок см. SQLCLR против SQL Server 2017, часть 4: «Доверенные сборки» - разочарование .

...