C# 編譯器的安全性選項

下列選項可控制編譯器的安全性選項。 新的 MSBuild 語法會以粗體顯示。 舊的 csc.exe 語法會以 code style 顯示。

  • PublicSign / -publicsign:公開簽署組件。
  • DelaySign / -delaysign:只使用強式名稱金鑰的公開金鑰延遲簽署組件。
  • KeyFile / -keyfile:指定強式名稱金鑰檔案。
  • keycontainer / -keycontainer:指定強式名稱金鑰容器。
  • HighEntropyVA / -highentropyva:啟用高熵位址空間配置隨機化 (ASLR)

PublicSign

此選項會促使編譯器套用公開金鑰,但不會實際簽署組件。 -publicsign 選項也會在組件中設定一個位元,以告知執行階段該檔案實際上已經過簽署。

<PublicSign>true</PublicSign>

PublicSign 選項需要使用KeyFileKeyContainer 選項。 KeyFileKeyContainer 選項可指定公開金鑰。 PublicSignDelaySign 選項互不相容。 公用簽署有時也稱為「假簽署」或「OSS 簽署」,其會在輸出組件中包含公開金鑰,並設定「已簽署」旗標。 公用簽署實際上不會使用私密金鑰簽署組件。 開發人員會對開放原始碼專案套用公用簽署。 當建置組件無法存取用於簽署組件的私密金鑰時,會建置相容於所發行之「完整簽署」組件的組件。 因為幾乎沒有取用者真的需要檢查組件是否已完整簽署,因此幾乎所有要使用完整簽署組件的情況,都可使用這些公開建置的組件。

DelaySign

這個選項可讓編譯器保留輸出檔案中的空間,以便稍後新增數位簽章。

<DelaySign>true</DelaySign>

若您需要完整簽署的組件,請使用 DelaySign-。 若您只想在組件中放入公開金鑰,請使用 -DelaySignDelaySign 選項必須搭配 KeyFileKeyContainer 才有作用。 KeyContainerPublicSign 選項互不相容。 當您要求完整簽署的組件時,編譯器會雜湊包含資訊清單 (組件中繼資料) 的檔案,並使用私密金鑰簽署該雜湊。 該作業會建立數位簽章,並儲存在包含資訊清單的檔案中。 當組件延遲簽署時,編譯器不會計算和儲存簽章。 相反地,編譯器會保留檔案中的空間,供之後新增簽章之用。

使用 DelaySign 可以讓測試人員將組件放入全域快取之中。 測試之後,您可以使用 Assembly Linker 公用程式將私密金鑰放入組件中,以完整簽署組件。 如需詳細資訊,請參閱建立和使用強式名稱的組件延遲簽署組件

KeyFile

指定包含密碼編譯金鑰的檔名。

<KeyFile>filename</KeyFile>

file 是包含強式名稱金鑰的檔案名稱。 使用此選項時,編譯器會從指定的檔案將公開金鑰插入資訊清單中,然後使用私密金鑰簽署最終組件。 若要產生金鑰檔,請在命令列中輸入 sn -k file。 編譯時若是使用 -target:module,則當您使用 AddModules 編譯組件時,會將金鑰檔案的名稱保留在模組中,然後再併入組件。 您也可以使用 KeyContainer,將加密資訊傳遞給編譯器。 如需部分簽署的組件,請使用DelaySign。 若在編譯中同時指定了 KeyFile and KeyContainer,編譯器會先嘗試金鑰容器。 如果這個動作成功,則會使用金鑰容器中的資訊來簽署組件。 若編譯器找不到金鑰容器,將會嘗試 KeyFile 指定的檔案。 若成功,組件會以金鑰檔案中的資訊簽署,而金鑰資訊也會導入金鑰容器中。 該金鑰容器會在下次編譯時生效。 請注意,金鑰檔案可能只包含公開金鑰。 如需詳細資訊,請參閱建立和使用強式名稱的組件延遲簽署組件

KeyContainer

指定密碼編譯金鑰容器的名稱。

<KeyContainer>container</KeyContainer>

container 是強式名稱金鑰容器的名稱。 使用 KeyContainer 選項時,編譯器會建立可共用的元件。 編譯器會從指定的容器將公開金鑰插入至組件資訊清單,然後使用私密金鑰簽署最終組件。 若要產生金鑰檔,請在命令列中輸入 sn -k filesn -i 會將金鑰組安裝於容器中。 當編譯器在 CoreCLR 上執行時,不支援此選項。 若要在 CoreCLR 上建置時簽署組件,請使用 KeyFile 選項。 編譯時若是使用 TargetType,則當您使用 AddModules 將此模組編譯成組件時,會將金鑰檔案的名稱保留在模組中,然後再併入組件。 您也可以在任何 Microsoft 中繼語言 (MSIL) 模組的原始程式碼中,將這個選項指定為自訂屬性 (System.Reflection.AssemblyKeyNameAttribute)。 您也可以使用 KeyFile,將加密資訊傳遞給編譯器。 使用 DelaySign 可將公開金鑰新增至組件資訊清單,但等到測試之後,才簽署組件。 如需詳細資訊,請參閱建立和使用強式名稱的組件延遲簽署組件

HighEntropyVA

-highentropyva 編譯器選項會告知 Windows 核心,某特定的可執行檔是否支援高熵位址空間配置隨機載入 (ASLR)。

<HighEntropyVA>true</HighEntropyVA>

此選項可指定 64 位元的可執行檔,或 PlatformTarget 編譯器選項標記的可執行檔,支援高熵虛擬位址空間。 根據預設,所有 .NET Standard 和 .NET Core 版本,以及自 .NET Framework 4.5 起的 .NET Framework 版本都會啟用此選項。

當隨機化處理序的位址空間配置,作為 ASLR 一部分時,HighEntropyVA 選項就能允許相容的 Windows 核心版本使用較高程度的高熵。 使用較高程度的高熵,表示可將大量位址配置到記憶體區域,例如堆疊和堆積, 因此,猜測特定記憶體區域的位置會更加困難。 HighEntropyVA 編譯器選項需要目標可執行檔,而任何需要該可執行檔的模組,在以 64 位元的處理序執行時,都能處理大於 4 GB 的指標值。