Отложенная подпись сборки

Организация может располагать тщательно оберегаемой парой ключей, повседневный доступ к которой разработчикам не предоставляется. Открытый ключ часто является доступным, но доступ к закрытому ключу предоставляется лишь отдельным лицам. При разработке сборок со строгими именами каждая сборка, в которой имеется ссылка на другую сборку со строгим именем, должна содержать маркер открытого ключа, использованного для присвоения строгого имени второй сборке. Данный подход требует, чтобы открытый ключ был доступен во время процесса разработки.

Во время компоновки сборки можно использовать отложенную или частичную подпись для того, чтобы зарезервировать в переносимом исполняемом файле (PE-файле) место для подписи строгого имени, а применение полноценной подписи отложить и выполнить на следующем этапе (обычно непосредственно перед поставкой сборки).

В приведенной ниже последовательности шагов отражены основные этапы отложенного подписания сборки.

  1. Получите открытый ключ, входящий в состав пары ключей, у организации, отвечающей за окончательную подпись. Обычно этот ключ предоставляется в форме SNK-файла, который может быть создан с помощью программы строгих имен (Sn.exe), входящей в состав Пакет средств разработки программного обеспечения (SDK) для Windows.

  2. Включите в исходный код сборки два указанных ниже настраиваемых атрибута из пространства имен System.Reflection.

    • Атрибут AssemblyKeyFileAttribute, который передает имя файла, содержащего открытый ключ, своему конструктору в качестве параметра.

    • Атрибут AssemblyDelaySignAttribute, который указывает, что используется отложенная подпись, передавая значение true своему конструктору в качестве параметра. Пример:

      <Assembly:AssemblyKeyFileAttribute("myKey.snk")>
      <Assembly:AssemblyDelaySignAttribute(True)>
      
      [assembly:AssemblyKeyFileAttribute("myKey.snk")]
      [assembly:AssemblyDelaySignAttribute(true)]
      
      [assembly:AssemblyKeyFileAttribute("myKey.snk")];
      [assembly:AssemblyDelaySignAttribute(true)];
      
  3. Компилятор вставляет открытый ключ в манифест сборки и резервирует в PE-файле место для полной подписи строгого имени. При компоновке сборки должен использоваться подлинный открытый ключ, чтобы другие сборки, ссылающиеся на данную сборку, могли получить этот ключ и сохранить его в своих ссылках на сборку.

  4. Поскольку подпись строгого имени сборки пока некорректна, необходимо отключить проверку этой подписи. Это можно сделать с помощью программы строгих имен, используя параметр –Vr.

    В следующем примере производится отключение проверки сборки myAssembly.dll.

    sn –Vr myAssembly.dll
    
    Предупреждающее замечаниеВнимание

    Параметр -Vr следует использовать только на этапе разработки.При добавлении сборки в список непроверяемых сборок создается уязвимость в системе безопасности.Вредоносная сборка может использовать полное имя сборки (имя сборки, версия, язык и региональные параметры, маркер открытого ключа), добавленное в список непроверяемых, с целью подделки ее идентификации.Данный подход позволяет вредоносной сборке также избежать проверки.

    ПримечаниеПримечание

    Если во время разработки с помощью Visual Studio на компьютере с 64-разрядной архитектурой используется отложенная подпись и сборка компилируется для конфигурации Любой ЦП, возможно, параметр -Vr потребуется применить дважды.(В Visual Studio конфигурация Любой ЦП является значением свойства построения Целевая платформа; при компиляции из командной строки это параметр по умолчанию.) Чтобы запустить приложение из командной строки или в Windows Explorer, используйте 64-разрядную версию Sn.exe (средство строгих имен), чтобы применить к сборке параметр -Vr.Чтобы загрузить сборку в Visual Studio во время разработки (например, если сборка содержит компоненты, используемые другими сборками в приложении), необходимо использовать 32-разрядную версию средства работы со строгими именами.Причина заключается в том, что JIT-компилятор компилирует сборки в 64-разрядный машинный код, когда сборка запускается из командной строки, и в 32-разрядный машинный код, когда сборка загружается в среду во время разработки.

  5. Позже, обычно сразу перед поставкой, необходимо отправить сборку в подписывающий центр организации для подписания действующим строгим именем с помощью параметра программы строгих имен –R.

    В следующем примере сборка с именем myAssembly.dll подписывается строгим именем с помощью пары ключей sgKey.snk.

    sn -R myAssembly.dll sgKey.snk
    

См. также

Задачи

Практическое руководство. Создание пары открытого и закрытого ключей

Ссылки

Sn.exe (средство строгих имен)

Основные понятия

Создание сборок

Другие ресурсы

Программирование с использованием сборок