搜尋此網誌

2012年10月8日 星期一

UEFI影像檔上作個簽章

1.6 在UEFI影像檔上作簽章

此章節提供詳細說明如何在UEFI影像檔上作個簽章。
背景資訊關於簽署一個UEFI可執行章經微軟的可信碼(Authenticode)

  • http://msdn.microsoft.com/en-us/library/ms537359.aspx
  • 利用UEFI Shell, 移動平台超脫於DOS,MichaelRothman www.intel.com/intelpress, 請參閱附錄A - “安全注意事項”。
  • 參考PE/COFF與可信碼(Authenticode)說明書,在1.1.1章節。

1.6.1 微軟視窗為主的簽章工具
這部分為:
  • 列出微軟視窗工具的設定,它可以被使用在UEFI影像檔上作一個簽章。
  • 列出哪裡可以得到此工具。
  • 描述如何產生所需的鑰匙與憑證。
  • 具體說明如何使用那些鑰匙與憑證去作一個簽章在UEFI的影像檔上。
當簽可執行的憑證利用微軟可信碼(Authenticode)的簽章工具,這數位簽章被產生,它符合憑證型態WIN_CERT_TYPE_PKCS_SIGNED_DATA,還有它被定義在UEFI 2.3.1A規格書中。

1.6.1.1 需求工具
這節列出工具的設定,那符合簽章的方案,詳細在1.6.1.5與1.6.1.6章節。
這種情況下,需要以下工具:

  • Microsoft* MakeCert – 建立一個私有的祕鑰(.pvk檔案)與X509憑證(.cer檔案).
  • Microsoft* Pvk2Pfx – 轉換.pvk檔案到.pfx檔案。
  • Microsoft* SignTool – 簽署一個PE/COFF影像檔,例如:建立a .efi檔案利用密鑰與憑證,藉由makecert與pvk2pfx工具。
其他的使用資訊關於微軟的工具,可以在MSDN上找到(www.msdn.microsoft.com)。
注意: 這pfx, pvk檔案格式被描述在1.6.1.3章節下面。

1.6.1.2 取得工具
此時,這三個工具的最新版本都被放在Windows 8的消費者預覽版SDK,請造訪:http://msdn.microsoft.com/en-us/windows/hardware/hh852363,在C:\Program Files (x86)\Windows Kits\8.0\bin\... 目錄。
注意:這些工具必須被運行在SDK中的它們的位置,因為他們需要額外的DLL和檔案清單從該位置。換言之.exe的不應該被複製到和執行從另一個位置。
注意: 避免使用舊版本。

1.6.1.3 詳細的檔案格式
本章節提供檔案格式使用上的詳細資訊:
•     .pvk is a Microsoft private key file format.
•     .cer is a X509 certificate format using ASN.1 DER encoding.
•     .pfx format is defined by the PKCS#12 standard
(http://www.rsa.com/rsalabs/node.asp?id=2138 )

1.6.1.4 本文檔中使用的文件
在隨後的章節參考下列檔案使用的情況。
•     Driver being signed - MyDriver.efi
•     Root Certificate.  Use for development and test only.
•     PkRoot.cer  - Root certificate in X509 format.
•     PkRoot.pvk  - The Root Certificate’s private key in Microsoft PVK format. Has a password.
•     PkRoot.pfx - Root Certificate’s private key in PKCS#12 format.
•     Sub-Certificate.  Signed by the root certificate. Used to sign the driver. Will be enrolled in the KEK variable.
•     KekRoot.cer – Sub-certificate in X509 format.  Will be enrolled as KEK.
•     KekRoot.pvk - Sub-Certificate’s private key in Microsoft PVK format. Has a password.
•     KekRoot.pfx - Sub-Certificate’s private key in PKCS#12 format.

1.6.1.5 建立密鑰與憑證用於開發與測試

本節介紹了如何建立關於開發和測試用途,使用Microsoft* SignTool去簽署PE/ COFF影像檔所需要的密鑰和證書。它也有可能使用其他形式的簽署工具,或一個經由OSV或受信任的第三方提供的證書頒發機構CA去簽署開發與測試的影像檔。
注意:這些臨時的自我產生的密鑰和自我簽署憑證的使用目的是,在開發和測試過程中使用,而不是只作為生產用途。
注意:生產的影像的的簽章,需要先進的密鑰管理措施,以確保私鑰的安全和超出此文件的範圍。
注意:下面的範例指令顯示x64可執行檔的Windows8消費者預覽SDK的預設安裝路徑。

在這文件中的範例詳細介紹了使用兩個層次的憑證鏈
步驟如:

  1. 產生一個自我簽名憑證,作為來源的憑證(Root Certificate)。.
  2. 使用此來源的憑證(Root Certificate)去簽署一個子憑證(Sub-Certificate (a.k.a. child certificate))。

1. 產生一個自我簽名憑證。使用該憑證的來源的憑證(Root Certificate)還將它命名為PkRoot.cer。它是不的信任,並僅用於開發和測試使用。其相關的私有密鑰文件為PkRoot.pvk。

在DOS環境下的命令列是:
〉 "C:\Program Files (x86)\Windows Kits\8.0\bin\x64"\ makecert -n "CN=PkRoot " -r -sv PkRoot.pvk PkRoot.cer
Figure 3 PkRoot.pvk設定密碼

系統會提示您去設定的密碼PkRoot.pvk檔案。請記下此密碼待會使用。然後輸入這個密碼,去簽署PkRoot.cer。請參閱圖3。

2. 使用PkRoot.cer去簽署一個子認證,它的名稱是KekRoot.cer。其相關
私有密鑰文件為KekRoot.pvk。
在DOS環境下的命令列是:
〉 "C:\Program Files (x86)\Windows Kits\8.0\bin\x64"\ makecert -n "CN=KekRoot " -iv PkRoot.pvk -ic PkRoot.cer -sv KekRoot.pvk KekRoot.cer
圖4 KekRoot.pvk設定密碼

對於KekRoot.pvk文件,系統會提示您設置密碼,請參考圖4。請記下此密碼待會使用。然後輸入密碼PkRoot.pvk簽署KekRoot.cer。請參閱圖5。

圖5 輸入TestRoot.pvk密碼KekRoot.cer簽證
注意:我們可以用這方法來建立任何子層級的憑證,在這裡我們只是展示出一個兩個層的子憑證鏈。

1.6.1.6 在一個UEFI影像檔上作簽章

下面的步驟需要去簽署一個PE/COFF影像檔:

•     Convert the PVK file to PFX format (PKCS#12).
在DOS環境下的命令列是:
〉 "C:\Program Files (x86)\Windows Kits\8.0\bin\x64"\ pvk2pfx.exe –pvk KekRoot.pvk –pi 〈password〉 –spc KekRoot.cer –pfx KekRoot.pfx –f
注意:不要copy/paste此命令列從此文件到pvk2pfx。這工具不處理Unicode字元。

•    簽署MyDriver.efi利用SHA-256.
注意:signtool修改未簽署的驅動程式,經由添加簽章。如果你想保留一份未簽名的驅動程式,請先將它複製成另一個名稱。
Note:   signtool modifies the unsigned driver by adding the signature.  If you wish to maintain a copy of the unsigned driver, first copy it to another name.
在DOS環境下的命令列是:
〉 "C:\Program Files (x86)\Windows Kits\8.0\bin\x64"\ SignTool.exe sign /ac KekRoot.cer /f KekRoot.pfx /p 〈password〉  /fd sha256 MyDriver.efi

注意:所有的影像檔必須簽署執行一次安全啟動致能(即一旦PK已經登記與該平台是在使用者模式下,如圖6所示)。

1.6.2 Linux為主的簽章
資訊在Linux為主的簽章工具將會被加入,當它可用時。

1.6.3 影像檔驗證規則
所有簽章工具必須遵從微軟的可信碼(Authenticode)與PE/COFF規格書,參考如上。

在這些規範中的詳細規則的總結是:

  • 此影像檔的PE/ COFF部分必須是整齊的。那是每個部分的PointerToRawData應該大於前一個部分的PointerToRawData。
  • 這影像檔的PE/ COFF部分必須是相鄰的。那是不應該有差距當此部分被載入到記憶體,經它們的VirtualSize與VirtualAddress的參數,還有填補,如定義在PE/ COFF的規範書中。
  • 無符號的.efi 影像檔案的大小必須符合Autheticode的雜湊演算法。這概述如下:

a. 無符號的.efi 影像檔案的實際大小,如同存在,透過dir或ls命令或檔案的屬性,應該等於。
b.總和:
  1. The PE/COFF OptionalHeader.SizeOfHeaders
  2. The sum of each section’s SizeOfRawData.

注意:在P /COFF的值OptionalHeader.SizeOfImage的領域可能會有所不同
對於檔案的大小,跟一些工具鏈。

任何其他存在的資料在.efi 影像檔案將會導致影像檔驗證Authenticode失敗。
在微軟視窗系統,這些值可以使用以下方式獲得:
link –dump –headers  file.efi

在Linux系統上:
objdump –x file.efi

顯示出VirtualSize的部分,但不是該SizeOfRawData的部分,它是需要計算的。

沒有留言:

張貼留言