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

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

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

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

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

  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
    

    Чтобы отключить проверку на платформах, где невозможно запустить средство строгого имени, например микропроцессоры advanced RISC Machine (ARM), используйте параметр -Vk для создания файла реестра. Импортируйте файл реестра в реестр на компьютере, где нужно отключить проверку. В следующем примере создается файл реестра для myAssembly.dll.

    sn -Vk myRegFile.reg myAssembly.dll
    

    При использовании параметра -Vr или -Vk можно дополнительно включить SNK-файл для подписи тестового ключа.

    Предупреждение

    Строгие имена не являются средством обеспечения безопасности. Они служат только для однозначной идентификации.

    Примечание.

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

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

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

    sn -R myAssembly.dll sgKey.snk
    

См. также