Подписание в цифровой форме после компиляции
С развертыванием общедоступных сборок связана еще одна проблема. Шаги, описанные выше, годились для цифрового подписания сборки во время компиляции, так как использовался атрибут, определяющий файл ключей, который содержал открытый и секретный ключи Но часто случается так, что ни один из программистов, разрабатывающих компоненты, которые будут упакованы в сборки, не знает секретного ключа всей организации.
В этом случае при разработке и испытании программисты должны использовать временный секретный ключ, но когда придет время отправить сборку клиентам, назначенный представитель компании выполняет окончательное цифровое подписание, используя официальный секретный ключ организации, хранимый в строгой тайне. Это делается при помощи инструмента Sn.exe, с использованием опции – R, где "R" означает "resign" ("подписать заново"). Как правило, предварительно с помощью опции – k утилиты Sn.exe генерируется официальная криптографическая пара. Затем, используя опцию – R утилиты Sn.ехе ставится подпись на каждой новой сборке.
sn – k TrueKeyPair.snk sn – R SharedComponent.dll TrueKeyPair.snk
Хотя здесь две команды показаны вместе, обычно не нужно генерировать новую криптографическую пару каждый раз, когда вы заново подписываете очередную новую сборку. После второй команды на пульте появится сообщение Assembly 'SharedComponent.dll' successfully re-signed (Сборка 'SharedComponent.dll' успешно подписана заново).
Впрочем, есть и другой метод: вы можете задержать цифровое подписание. При создании сборки открытый ключ делается доступным компилятору, чтобы он мог поместить его в поле PublicKey декларации сборки. В файле резервируется место для подписи (сигнатуры), но сама подпись (сигнатура) не генерируется. Когда в конечном счете будет сгенерирована фактическая подпись (сигнатура), она помешается в файл с помощью опции – R утилиты Strong Name (sn.exe).
Чтобы указать компилятору, что вы хотите использовать отсроченное цифровое подписание, вы указываете значение true (истина) для атрибута AssemblyDelaySignAttribute в исходном тексте. Вы также должны включить открытый ключ с помощью атрибута:
AssemblyKeyFileAttribute
Предположим, что вы сгенерировали криптографическую пару открытого и секретного ключа так, как описано выше. Тогда вы с помощью опции – р утилиты Strong Name можете получить только открытый ключ, все еще сохраняя в тайне секретный ключ.
sn – p TrueKeyPair.snk PublicKey.snk
Затем вы добавляете следующие два атрибута к вашему коду:
[assembly:AssemblyDelaySignAttribute(true)]; [assembly:AssemblyKeyFileAttribute("PublicKey.snk")];
Сборка все еще не имеет правильной подписи (сигнатуры). Вы не сможете установить ее в глобальном кэше сборок или загрузить ее из каталога приложения. Вы можете отключить проверку подписи (сигнатуры) конкретной сборки, используя опцию – Vr утилиты Strong Name.
sn – Vr SharedComponent.dll
Перед поставкой сборку надо снабдить правильной сигнатурой (подписью), чтобы она могла быть развернута как общедоступная сборка. Для этого используйте опцию – R утилиты Strong Name и запишите криптографическую пару открытого и секретного ключей.
sn – R SharedComponent.dll TrueKeyPair.snk