Развертывание пользовательского интерфейса CLR в SQL Server 2017: процедура - PullRequest
2 голосов
/ 28 марта 2019

Я пытаюсь развернуть сборку CLR в БД SQL Server 2017, следуя процедуре, описанной в https://sqlquantumleap.com/2017/08/09/sqlclr-vs-sql-server-2017-part-2-clr-strict-security-solution-1/. В основном, для целей тестирования я просто включаю сборку с парой функций на основе Regex:

public class TextUdf
{
    [SqlFunction(Name = "RegexIsMatch", IsDeterministic = true, IsPrecise = true)]
    public static SqlBoolean RegexIsMatch(SqlString text, SqlString pattern,
        SqlInt32 options)
    {
        if (text.IsNull) return SqlBoolean.Null;
        if (pattern.IsNull) pattern = "";

        return Regex.IsMatch((string)text,
            (string)pattern,
            options.IsNull? RegexOptions.None : (RegexOptions)options.Value,
            new TimeSpan(0, 0, 10))
            ? SqlBoolean.True
            : SqlBoolean.False;
    }

    [SqlFunction(Name = "RegexReplace", IsDeterministic = true, IsPrecise = true)]
    public static SqlString RegexReplace(SqlString text, SqlString pattern,
        SqlString replacement, SqlInt32 options)
    {
        if (text.IsNull || pattern.IsNull) return text;

        return Regex.Replace((string)text, (string)pattern,
            (string)replacement,
            options.IsNull ? RegexOptions.None : (RegexOptions)options.Value);
    }
}

Я создал полное решение для репродукции на https://github.com/Myrmex/sqlclr. Я могу следовать всей описанной там процедуре (readme) до того момента, когда мне нужно будет назначить сертификат PFX для сборки CLR, которая будет развернута. В этот момент я получаю эту ошибку:

MSB3325: Cannot import the following key file: pfx. The key file may be password protected. To correct this, try to import the certificate again or manually install the certificate to the Strong Name CSP with the following key container name: ...

Следуя указаниям, приведенным в сообщении об ошибке, я обнаружил, что могу решить эту проблему, установив PFX с sn, чтобы можно было вводить пароль вручную при появлении запроса (см. Невозможно импортировать файл ключа 'blah.pfx' - ошибка 'Файл ключа может быть защищен паролем' ).

После этого я мог бы скомпилировать свою сборку CLR с функциями UDF. Теперь, когда я пытаюсь установить его в тестовую базу данных (просто пустую базу данных, созданную для этой цели), через CREATE ASSEMBLY [SqlServerUdf] FROM 0x...binary stuff... я получаю эту ошибку:

CREATE or ALTER ASSEMBLY for assembly 'SqlServerUdf' with the SAFE or EXTERNAL_ACCESS option failed because the 'clr strict security' option of sp_configure is set to 1. Microsoft recommends that you sign the assembly with a certificate or asymmetric key that has a corresponding login with UNSAFE ASSEMBLY permission. Alternatively, you can trust the assembly using sp_add_trusted_assembly.

, которая просто противоречит цели длинной процедуры, которой я должен был следовать, чтобы позволить SQL Server принимать мой CLR без потери строгой безопасности.

Очевидно, что я что-то упустил, но я не уверен во многих деталях хитрой процедуры, так что это будет сложная догадка. Может кто-нибудь подсказать, что не так с процедурой, чтобы у нас была быстрая и грязная пошаговая инструкция о том, как вставить сборку CLR в SQL Server? Эта простая задача, кажется, стала очень трудной с последней версией ...

1 Ответ

2 голосов
/ 28 марта 2019

Исходя из того, что я вижу в репозитории GitHub, кажется, что вы пропустили несколько шагов:

  1. Вы не установили пароль для исходного SQL2017_KeyAsm проект.Вот почему это все еще файл .snk (т.е. SQL2017_KeyAsm.snk ) вместо файла .pfx (т.е. SQL2017_KeyAsm.pfx ),Я предполагаю, что вы un отметили флажок «Защитить файл ключа с помощью пароля» (я думаю, что он установлен по умолчанию), поскольку у вас вообще не должно быть .snk ,Кроме того, в вашем файле SQL2017_KeyAsm.sqlproj у вас есть:

    <AssemblyOriginatorKeyFile>SQL2017_KeyAsm.snk</AssemblyOriginatorKeyFile>
    

    Когда у вас должно иметь следующее:

    <AssemblyOriginatorKeyFile>SQL2017_KeyAsm.pfx</AssemblyOriginatorKeyFile>
    

    Хотя ваши инструкции в файле readme верны, как вы там заявили: «введите пароль».Тем не менее, это, вероятно, объясняет полученную вами ошибку пароля, поскольку нет пароля, защищающего закрытый ключ.Либо это, либо ошибка пароля связана с использованием неверного файла pfx (см. Ниже).Думаю, сначала попробуйте исправить перечисленные ниже пункты, поскольку может обойтись без SNK без пароля, я просто никогда не пробовал.

  2. Вконец раздела Единовременные процедуры , в двух последних шагах сразу после абзаца, начинающегося с «Наконец, следующие шаги ...», шаг 2 использует неправильный .pfx файл.Я предполагаю, что это прямой результат отсутствия файла .pfx на предыдущем шаге (из-за отсутствия пароля), поэтому вы взяли единственный файл .pfx , которыйбыл здесь. Именно по этой вы получаете сообщение об ошибке при попытке загрузить сборку SqlServerUdf : вы подписали сборку сертификатом , но этот сертификат использовался только какмеханизм загрузки сборки KeyAsm в [master], чтобы из нее можно было извлечь асимметричный ключ.После этого сертификат сбрасывается.Асимметричный ключ - это открытый ключ файла .snk , который был создан, когда вы сказали Visual Studio, что хотите подписать проект SQL2017_KeyAsm .Таким образом, файл .snk (или .pfx , если вы защищаете его паролем) - это то, что вам нужно выбрать, когда вы говорите Visual Studio подписать SqlServerUdf проект.При этом будет использоваться один и тот же закрытый ключ для подписи обоих проектов / сборок.

Итак, первое, что нужно сделать, это изменить закрытый ключ, используемый для подписи сборки SqlServerUdf ,Это не должен быть файл сертификата .pfx .Это должен быть тот же ключ, который используется для подписи файла KeyAsm.В вашем случае это будет SQL2017_KeyAsm.snk .

Попробуйте сделать это одно изменение и посмотрите, все ли работает.Если нет, вернитесь и добавьте пароль в файл snk (через Visual Studio).Вам не нужно повторно генерировать сертификат или его файл .pfx , потому что открытый ключ должен оставаться прежним, и это все, что в любом случае загружается в [master].Но, дайте мне знать, если это все еще не работает.В то же время я обновлю этот пост, чтобы более подробно рассказать о пароле и о том, какой файл pfx использовать, когда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...