Давайте рассмотрим пример, где мы хотим создать сборку с устойчивым именем, которую можно распространять таким образом, чтобы получатель сборки смог использовать устойчивое имя для предоставления полномочия FullTrust
.
Прежде всего необходимо создать пару ключей, так как устойчивые имена используют криптографию с открытым ключом. Открытый и закрытый ключи хранятся в указанном файле и используются для подписи устойчивого имени. Чтобы создать два ключа, используется sn.exe
(Strong Name Tool — утилита устойчивого имени), которая помимо помощи в создании ключей, может также использоваться для управления ключами и устойчивыми именами. Попробуем создать ключ, для чего введем команду:
sn.exe -k key.snk
Затем файл с ключами ( key.snk
в данном случае) поместим в ту же папку, где Visual Studio создает файл вывода (обычно папка Debug), а затем ключ добавим в код с помощью атрибута сборки. Когда этот атрибут добавлен в AssemblyInfo.cs
, остается только заново скомплектовать сборку. Перекомпиляция обеспечивает, новое вычисление хэш-значения и сборка защищается против злонамеренных модификаций:
[assembly: AssemblyKeyFileAttribute("key.snk")]
Итак, наша сборка откомпилирована и подписана, она имеет уникальное идентифицирующее устойчивое имя. Теперь можно создать новую группу кода на машине, где мы хотим выполнить сборку. Эта группа имеет условие членства, которое требует соответствия с устойчивым именем сборки.
Следующая команда утверждает, что мы собираемся создать новую группу кода, используя устойчивое имя из указанного файла манифеста сборки, а также что нас не интересует используемая версия сборки и что группе кода присваиваются полномочия FullTrust
:
caspol.exe -addgroup 1 -strong -file \bin\debug\SecurityApp10.exe -noname -noversion FullTrust
Приложение в этом примере будет теперь выполняться из любой зоны, даже зоны Internet
, так как устойчивое имя предоставляет достаточное свидетельство того, что сборка является надежной. Просмотрев группы кода с помощью caspol.exe -listgroups
, увидим новую группу кода (1.8) и ее ассоциированный открытый ключ (в шестнадцатеричном представлении):
1. All code: Nothing
1.1. Zone — MyComputer: FullTrust
1.2. Zone — Intranet: LocalIntranet
1.2.1. All code: Same site Socket and Web.
1.2.2. All code: Same directory FileIO — Read, PathDiscovery
1.3. Zone — Internet: Internet
1.3.1. All code: Same site Socket and Web.
1.4. Zone — Untrusted: Nothing
1.5. Zone — Trusted: Internet
1.5.1. All code: Same site Socket and Web.
1.6. StrongName —
02400000480000094000000060200000024000052534131000400000100010007D1FA57C4AED9F0A32
E84AA0FAEFD0DE9E8FD6AEC8F87FB03766C834C99921EB23BE79AD9D5DCC1DD9AD236132102900B723
CF980957FC4E177108FC607774F29E8320E92EA05ECE4E821C0A5EFE8F1645C4C0C93C1AB99285D622
CAA652C1DFAD63D745D6F2DE5F17E5EAF0FC4963D261C8A12436518206DC093344D5AD293:
FullTrust
1.7. StrongName - 00000000000000000400000000000000: FullTrust
1.8. StrongName -
00240000048000009400000006020000002400005253413100040000010001007508D0780C56AF85BA
1BAD6D88E2C653E0A836286682C18134CC989546C1143252795A791F042238040F5627CCC1590ECEA3
0A9CD4780F5F0B29B55C375D916A33FD46B14582836E346A316BA27CD555B8F715377422EF589770E5
A5346A00BAABB70EF36774DFBCB17A30B67C913384E62A1C762CF40AFE6F1F605CCF406ECF:
FullTrust
Success
Для доступа к строгому имени в сборке можно применить утилиту secutil.exe
с файлом манифеста сборки. Воспользуемся secutil.exe
для просмотра данных устойчивого имени нашей сборки. Мы добавим параметр -hex
, чтобы открытый ключ был показан в шестнадцатеричном представлении (как в caspol.exe
), и аргумент strongname
, определяющий, что мы хотим увидеть строгое имя. Введите эту команду, и появится листинг, содержащий открытый ключ устойчивого имени, имя сборки и версию сборки.
secutil.exe -hex -strongname securityapp10.exe
Microsoft (R) .NET Framework SecUtil 1.0.xxxx.x
Copyright (c) Microsoft Corp 1999-2001. All rights reserved.
Public Key =
0x002400000480000094000000060200000024000052534131000400000100010x7508D0780C56AF85BAl
BAD6P88E2C653E0A836286682C18134CC988546C1143252795A791F042238040F5627CCC1590ECE
A30A9CD4780F5F0B29B55C375D916A33FD46B14582836E346A316BA27CD555B8F715377422EF589770
E5A5346AOOBAABB70EF36774DFBCB17A30B67C913384E62A1C762CF40AFE6F1F605CCF406ECF
Name = SecurityApp10
Version = 1.0.513.28751
Success
Можно заметить, что по умолчанию устанавливаются два строгих имени групп кода. Одно из них является ключом устойчивого имени кода Microsoft, а второй ключ устойчивого имени предназначен для частей .NET, представленных для стандартизации в ЕСМА, над которыми Microsoft имеет значительно меньший контроль.
Распространение кода с помощью сертификатов
В последнем разделе было рассмотрено, как можно применять уникальное устойчивое (строгое) имя к сборке, чтобы системный администратор мог явно предоставить сборкам полномочия, которые соответствуют этому устойчивому имени с помощью группы доступа к коду. Этот метод управления политикой системы безопасности может быть весьма эффективным, но иногда необходимо работать на более высоком уровне, где администратор политики системы безопасности предоставляет полномочия на основе издателя программного обеспечения, а не каждого отдельного программного компонента.
Читать дальше