前言
代碼簽名可確保應用程式的來源和完整性,特別是在 Windows 環境下使用自簽名證書。本文將介紹如何使用 makecert 生成自簽名證書,並通過 pvk2pfx 轉換為 .pfx格式進行代碼簽名。
生成自簽名證書
使用 makecert 命令生成證書,例子如下:
makecert /a sha256 /n "CN=Sample,O=Sample,C=JP" /r /h 0 /eku "1.3.6.1.5.5.7.3.3" -b 01/01/2023 -e 12/31/2030 /sv Sample.pvk Sample.cer
在此命令中,您可以根據需求修改以下部分:
- /n "CN=Sample,O=Sample,C=JP":修改 CN(通用名稱)、O(組織名稱)和 C(國家代碼)以符合需求。
- /b 和 /e:設置證書有效期的開始和結束日期。
- Sample.pvk 和 Sample.cer:生成的私鑰文件和證書文件名稱。
1.3.6.1.5.5.7.3.3 看起來像版本號,但其實它是一個 OID(Object Identifier),用來標識數位證書的用途。
在這個序列中,每個數字代表一個分類層級或組織,例如起始的 1.3.6 代表 ISO 成員美國的編碼,接下來的組合更細緻地定義了「代碼簽名」的用途。
OID 就像一種標準化的 ID,確保所有人都能理解證書的特定功能,例如代碼簽名、用戶身份驗證等。
OID 1.3.6.1.5.5.7.3.3 的每個數字分別代表不同層級的標識分類:
- 1:ISO 分配的根分類。
- 3:ISO 成員(美國)。
- 6:美國的國家標準組織(ANSI)。
- 1:IETF 旗下的網際網路領域。
- 5.5:IETF 公共密鑰基礎設施 (PKIX) 規範。
- 7:PKIX 延伸應用用途標識。
- 3:指定為延伸用途的分類。
- 3:表示「代碼簽名」功能。
這種分層方式確保了全球唯一性,並準確標識了不同的數位證書用途。
OID 1.3.6.1.4.1.311.10.3.13 是 Microsoft 特定的 OID,用於描述「證書授權文件簽名」功能。每個數字的意義如下:
- 1.3.6:ISO/ANSI 指定。
- 1.4.1:企業範圍的標識(此處代表 Microsoft)。
- 311:Microsoft 特有的分配 ID。
- 10.3.13:Microsoft 定義的功能範疇,這一組合特別指「Microsoft 文件簽名用途」,常用於簽名和驗證 Windows 的特定應用程式和檔案。
這種標識有助於管理特定的數位證書用途,例如 Windows 應用的文件驗證。
注意:
1.3.6.1.5.5.7.3.3
是一個全球通用的 OID,用於標識數據簽名的用途,與使用該 OID 的國家無關。因此,無論你在日本還是其他國家編寫程序,都應該使用這個固定的 OID 來表示「代碼簽名」。
生成 PFX 文件
接著,使用 pvk2pfx 將 .pvk 和 .cer 文件轉換為 .pfx 文件:
pvk2pfx /pvk Sample.pvk /pi 1234 /spc Sample.cer /pfx Sample.pfx /po 1234
可以根據需求修改:
- /pvk Sample.pvk 和 /spc Sample.cer 指定私鑰文件和憑證文件。
- /pi 1234 和 /po 1234 設置密碼,根據安全需求進行調整。
- /pfx Sample.pfx:生成 .pfx 文件的名稱。
總結
通過上述命令,您可以生成並簽署自簽名證書,並將其轉換為可用於代碼簽名的 .pfx 文件,確保您的應用程式的安全性與可信度。
使用 Signtool 為應用程式簽名
完成 .pfx 檔案的生成後,可以使用 signtool 命令為應用程式進行簽名。以下是範例操作:
- 將 Sample.exe 複製到 test 資料夾。
- 使用以下命令進行簽名:
signtool sign /fd sha256 /f Sample.pfx /p 1234 /t http://timestamp.digicert.com Sample.exe
- /fd sha256 指定哈希算法為 SHA-256。
- /f Sample.pfx 使用簽名證書。
- /p 1234 是 .pfx 檔案的密碼。
- /t 參數為時間戳服務。
完成這些步驟後,Sample.exe 就會帶有數位簽名,以確保其來源及完整性。
示例
在任意驅動器新建資料夾pfxTest,複製其Path。
以管理者身份運行Developer Command Prompt for VS 2022,並切換Path。
假設這個文件在D驅動,先輸入命令
D:
再輸入
cd D:\workspace\WorkInfoRepository\Test\pfxTest
執行命令
makecert /a sha256 /n "CN=test-2024-10-31,O=\"MyCompany Co.,Ltd.\",C=JP" /r /h 0 /eku "1.3.6.1.5.5.7.3.3" -b 10/31/2024 -e 10/31/2026 /sv myKey.pvk myCer.cer
會提示你設定密碼+讓你Enter證書。
第一步密碼設定之前會已經產生myKey.pvk文件,Enter證書之後會產生myCer.cer文件。
雙擊myCer.cer可以查看詳細信息。
再執行:
pvk2pfx /pvk myKey.pvk /pi 1234 /spc myCer.cer /pfx myPfx.pfx /po 1234
那麽就產生了pfx文件。
這三個文件之間的關係如下:
- myKey.pvk:這是私鑰文件,包含證書的私鑰,用於加密和數據簽名。這個文件應保持私密,因為它確保了證書的唯一性和安全性。
- myCer.cer:這是證書文件,包含公共證書信息,如 CN(通用名稱)。它不包含私鑰,通常公開分發,用來驗證簽名。
- myPfx.pfx:這是一個包含私鑰和證書的合併文件。PFX 文件通常用於導入證書和私鑰到其他系統或應用中。
這三個文件不必一定放在同一目錄下,但它們的使用是有順序和依賴關係的:
- 生成順序:通常先生成 myKey.pvk(私鑰文件)和 myCer.cer(證書文件),然後合併成 myPfx.pfx 文件。
- 應用需求:當您需要導入證書和私鑰時,可以直接使用 .pfx 文件,因為它包含了所有內容。myCer.cer 和 myKey.pvk 可以分開保存,僅在需要簽名或生成 .pfx 時才同時使用。
所以,它們不必放在同一目錄,只需確保應用程式能找到需要的文件。
通常 .pvk 和 .pfx 文件會設置密碼,而 .cer 文件則不會。
- .pvk 文件:保存私鑰,通常需要密碼保護以防止未經授權的使用。
- .pfx 文件:包含私鑰和證書的組合,因此密碼保護是必要的,以確保私鑰的安全。
.cer 文件僅包含公開證書,因此不需要密碼。
為單個文件進行數字簽名:
signtool sign /fd sha256 /f myPfx.pfx /p 1234 /t http://timestamp.digicert.com mytest.txt