Параметры компилятора C# для обеспечения безопасности

Следующие параметры управляют параметрами безопасности компилятора. Новый синтаксис MSBuild выделен полужирным шрифтом. Для старого синтаксиса csc.exe используется формат code style.

  • PublicSign / -publicsign: публичное подписывание сборки.
  • DelaySign / -delaysign: отложить подпись для сборки, используя только открытую часть ключа строгого имени.
  • KeyFile / -keyfile: указание файла ключа строгого имени.
  • KeyContainer / -keycontainer: указание контейнера ключа строгого имени.
  • HighEntropyVA / -highentropyva: включить технологию ASLR с высокой энтропией.

PublicSign

Этот параметр указывает компилятору на необходимость применения открытого ключа, но фактически не подписывает сборку. Кроме того, параметр PublicSign задает в сборке бит, тем самым сообщая среде выполнения, что файл подписан.

<PublicSign>true</PublicSign>

С параметром PublicSign необходимо использовать параметр KeyFile или KeyContainer. Параметры KeyFile и KeyContainer указывают открытый ключ. Параметры PublicSign и DelaySign — взаимоисключающие. При таком подписывании в сборку добавляется открытый ключ. Кроме того, в сборке устанавливается флаг "подписано". Такой подход иногда называют "фиктивным подписыванием" или "подписыванием OSS". Но фактически сборка не подписывается закрытым ключом. Разработчики используют публичное подписывание для проектов с открытым кодом. Им нужно создавать сборки, которые совместимы с выпущенными "полностью подписанными" сборками, но у них нет доступа к закрытому ключу, который использовался для подписывания сборок. Так как потребителям редко нужно проверять, полностью ли подписана сборка, создаваемые сообществами сборки можно использовать практические во всех случаях, в которых может использоваться полностью подписанная сборка.

DelaySign

Этот параметр указывает компилятору зарезервировать пространство в выходном файле, чтобы впоследствии добавить в него цифровую подпись.

<DelaySign>true</DelaySign>

Если требуется полностью подписанная сборка, используйте параметр DelaySign-. Если нужно лишь поместить в сборку открытый ключ, используйте параметр DelaySign. Параметр DelaySign не действует, если не использовать его с KeyFile или KeyContainer. Параметры KeyContainer и PublicSign являются взаимоисключающими. При запросе полностью подписанной сборки компилятор хэширует файл, содержащий манифест (метаданные сборки), и подписывает хэш закрытым ключом. Эта операция предназначена для создания цифровой подписи, которая хранится в файле, содержащем манифест. Если применяется отложенное подписывание сборки, компилятор не вычисляет и не сохраняет подпись, но он резервирует пространство в файле, чтобы подпись можно было добавить позже.

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

KeyFile

Задает имя файла, содержащего криптографический ключ.

<KeyFile>filename</KeyFile>

file — это имя файла, содержащего ключ строгого имени. При использовании этого параметра компилятор вставляет открытый ключ из указанного файла в манифест сборки и затем подписывает окончательную сборку закрытым ключом. Чтобы создать файл ключа, в командной строке введите sn -k file. При компиляции с параметром -target:module имя файла ключа сохраняется в модуле и включается в сборку, создаваемую при компиляции с параметром AddModules. Также можно передать сведения о шифровании компилятору с помощью параметра KeyContainer. Если требуется использовать частично подписанную сборку, укажите параметр DelaySign. Если для одной процедуры компиляции одновременно заданы параметрыKeyFile и KeyContainer, сначала будет предпринята попытка использовать контейнер ключей. В случае успеха сборка подписывается данными контейнера ключей. Если компилятору не удалось обнаружить контейнер ключей, будет предпринята попытка использовать файл, заданный параметром KeyFile. В случае успеха сборка подписывается данными из файла ключей, и эти данные о ключах будут помещены в контейнер ключей. Таким образом при следующей компиляции контейнер ключей будет действителен. Файл ключей может содержать только открытый ключ. Дополнительные сведения см. в разделах Создание и использование сборок со строгими именами и Отложенная подпись сборки.

KeyContainer

Задает имя контейнера криптографического ключа.

<KeyContainer>container</KeyContainer>

container — это имя контейнера ключа строгого имени. Если используется параметр KeyContainer, компилятор создает совместно используемый компонент. Компилятор вставляет открытый ключ из указанного контейнера в манифест сборки, после чего подписывает финальную сборку закрытым ключом. Чтобы создать файл ключа, в командной строке введите sn -k file. Команда sn -i устанавливает пару ключей в контейнер. Этот параметр не поддерживается, если компилятор работает в CoreCLR. Чтобы подписать сборку при компиляции в CoreCLR, используйте параметр KeyFile. При компиляции с параметром TargetType имя файла ключа сохраняется в модуле и включается в сборку при компиляции этого модуля с параметром AddModules. Этот параметр также можно указать как настраиваемый атрибут (System.Reflection.AssemblyKeyNameAttribute) в исходном коде для любого модуля CIL. Также можно передать сведения о шифровании компилятору с помощью параметра KeyFile. Если нужно добавить в манифест сборки открытый ключ, но при этом отложить подпись сборки до завершения ее тестирования, используйте параметр DelaySign. Дополнительные сведения см. в разделах Создание и использование сборок со строгими именами и Отложенная подпись сборки.

HighEntropyVA

Параметр компилятора HighEntropyVA сообщает ядру Windows, поддерживает ли указанный исполняемый файл технологию Address Space Layout Randomization (ASLR) с высокой энтропией.

<HighEntropyVA>true</HighEntropyVA>

Этот параметр указывает, что 64-битный исполняемый файл или исполняемый файл, отмеченный параметром компилятора PlatformTarget, поддерживает виртуальный диапазон адресов с высокой энтропией. Параметр включен по умолчанию для всех версий .NET Standard и .NET Core, а платформа .NET Framework версии, начиная с платформа .NET Framework 4.5.

Параметр HighEntropyVA позволяет совместимым версиям ядра Windows использовать более высокие степени энтропии во время рандомизации размещения диапазона адресов в рамках ASLR. Использование более высоких степеней энтропии означает, что можно выделить больше адресов таким областям памяти, как стеки и кучи. Из-за этого сложнее подобрать расположение определенной области памяти. Если указан параметр компилятора HighEntropyVA, целевой исполняемый файл и все модули, от которых он зависит, должны иметь возможность обработать значения указателя, размер которых превышает 4 гигабайта (ГБ), если они выполняются как 64-разрядный процесс.