布前校驗(yàn):mar_sign.sh 與 mar_verify.sh 的用法)
Zen Browser 更新包 MAR 怎么簽名并做發(fā)布前校驗(yàn)mar_sign.sh 與 mar_verify.sh 的用法【免費(fèi)下載鏈接】desktopWelcome to a calmer internet項(xiàng)目地址: https://gitcode.com/GitHub_Trending/desktop70/desktop發(fā)布 Zen Browser 時各平臺的 MAR 更新包如linux.mar/linux.mar必須先簽名簽名后的文件 hash 和大小會變化配套的update.xml清單也要同步更新在正式發(fā)布前還需要一次獨(dú)立校驗(yàn)確認(rèn)簽名、MAR channel 和清單三者一致。倉庫提供了兩個腳本來完成這件事scripts/mar_sign.sh 負(fù)責(zé)生成證書、把證書導(dǎo)入 updater 和簽名scripts/mar_verify.sh 負(fù)責(zé)發(fā)布前校驗(yàn)。下面按執(zhí)行順序說明兩個腳本的用法、所需環(huán)境變量和結(jié)果判斷。前置條件以下內(nèi)容來自腳本自身的檢查邏輯和錯誤提示一個由引擎構(gòu)建產(chǎn)物提供的signmar二進(jìn)制并通過SIGNMAR環(huán)境變量指向它的路徑否則-s會報Error: signmar not found at $SIGNMAR. Build the engine first.openssl以及 NSS 工具certutil、pk12utilhash 計算使用sha512sum不可用時回退到shasum -a 512各平臺的.mar文件已放在腳本會掃描的目錄中見「簽名 MAR 包」一節(jié)運(yùn)行mar_verify.sh時還需要RELEASE_BRANCH環(huán)境變量release或twilight以及工作目錄中的 Linux 安裝包zen.linux-x86_64.tar.xz/zen.linux-x86_64.tar.xz用于校驗(yàn)其中的update-settings.iniupdater 二進(jìn)制鏈接了nss和signmar見 updater-common-build.patchLinux 下補(bǔ)丁追加了 RPATH 以便運(yùn)行時找到 NSS/signmar 庫生成簽名證書mar_sign.sh -g-g會生成三樣?xùn)|西全部落在build/signing/下private_key.pem4096 位 RSA 私鑰cert.pem自簽名證書主題CNMAR Signing有效期設(shè)為腳本注釋中標(biāo)注的 RFC 5280 “no well-defined expiration” 哨兵值99991231235959Zpublic_key.der導(dǎo)出為 DER 的公鑰證書用于嵌入 updater另外腳本會把cert.pem和private_key.pem做 base64 編碼寫到build/signing/env/ZEN_SIGNING_CERT_PEM_BASE64和build/signing/env/ZEN_SIGNING_PRIVATE_KEY_PEM_BASE64供 CI 以后續(xù)環(huán)境變量的方式注入簽名材料。scripts/mar_sign.sh -g副作用腳本會創(chuàng)建temp/目錄并在用完后rm -rf刪除。腳本注釋明確說明public_key.der是唯一應(yīng)當(dāng)分發(fā)并嵌入 updater 的文件私鑰和完整證書不應(yīng)流出。把證書導(dǎo)入 updatermar_sign.sh -i要求先跑過-g缺少build/signing/public_key.der時會報Run with -g first.。-i會把public_key.der復(fù)制到engine/toolkit/mozapps/update/updater/下的 5 個證書文件release_primary.derrelease_secondary.derdep1.derdep2.derxpcshellCertificate.der注意腳本對每個文件是先用rm -f刪除再復(fù)制即這些路徑上原有的舊證書會被直接替換scripts/mar_sign.sh -i輸出最后一行就是下一步動作Done. Rebuild the updater to embed the new certificate.需要重新構(gòu)建 updater新證書才會真正生效。簽名 MAR 包mar_sign.sh -s-s會對當(dāng)前目錄下各平臺目錄中的所有.mar文件就地簽名。運(yùn)行前注意它的副作用每個.mar先簽成*.mar.signed再原樣覆蓋回原文件對應(yīng)清單目錄下的update.xml會被sed -i改寫替換hashValue和size兩個屬性簽名結(jié)束后cleanup_certs刪除build/signing/下的私密材料nss_config/、env/、private_key.p12、private_key.pem、cert.pem只保留public_key.der。SIGNMAR/path/to/signmar scripts/mar_sign.sh -s其中/path/to/signmar替換為你引擎構(gòu)建產(chǎn)物中 signmar 二進(jìn)制的實(shí)際路徑。環(huán)境變量ZEN_MAR_SIGNING_PASSWORDPKCS#12 打包用的密碼。未設(shè)置時腳本會打印警告并使用空密碼。ZEN_SIGNING_CERT_PEM_BASE64/ZEN_SIGNING_PRIVATE_KEY_PEM_BASE64設(shè)置后會被 base64 解碼寫入build/signing/cert.pem和build/signing/private_key.pem適合 CI 注入簽名材料未設(shè)置時則直接使用-g生成并留在磁盤上的這兩個 PEM 文件。腳本按目錄是否存在來掃描以下平臺目錄不存在或其中沒有.mar文件會報錯并以非零碼退出MAR 所在目錄對應(yīng)清單目錄linux.mar/linux_update_manifest_x86_64linux-aarch64.mar/linux_update_manifest_aarch64macos.mar/macos_update_manifestwindows.mar/windows_update_manifest_x86_64windows-arm64.mar/windows_update_manifest_arm64若存在.github/workflows/object/windows-x64-signed-x86_64/目錄Windows 兩個包改為從.github/workflows/object/windows-x64-signed-x86_64/與.github/workflows/object/windows-x64-signed-arm64/讀取清單則取這兩個目錄下的update_manifest子目錄。每個文件的實(shí)際簽名命令是$SIGNMAR -d $NSS_CONFIG_DIR -n mar_sig -s $mar_file $mar_file.signedNSS 數(shù)據(jù)庫build/signing/nss_config由腳本用certutil -N創(chuàng)建私鑰加證書以名稱mar_sig打包成 PKCS#12 并經(jīng)pk12util導(dǎo)入。簽名完成后腳本立即用signmar -v復(fù)核一次然后調(diào)用update_manifests因?yàn)楹灻麜淖兾募?hash 和大小腳本用新文件的sha512sum與字節(jié)數(shù)替換清單中每個update.xml的hashValue和size屬性。腳本自身的提示消息每個文件一組Signing ...、Signed ... Verifying signature...、Successfully signed ...、Manifest updated with new hashValue and size for ...。發(fā)布前校驗(yàn)mar_verify.sh按 scripts/mar_verify.sh 頭部注釋這一步在scripts/mar_sign.sh -s之后、發(fā)布之前運(yùn)行。它會建一個一次性的 NSS 數(shù)據(jù)庫只信任build/signing/public_key.der這樣不需要私鑰就能驗(yàn)證簽名SIGNMAR/path/to/signmar RELEASE_BRANCHrelease scripts/mar_verify.shRELEASE_BRANCH必須非空取值release或twilightSIGNMAR同樣替換為 signmar 的實(shí)際路徑。對每個 MAR校驗(yàn)內(nèi)容固定為四項(xiàng)文件存在且非空signmar -v驗(yàn)證簽名通過輸出Signature valid: marsignmar -T顯示恰好一個簽名塊Signature block found with 1 signature且產(chǎn)品信息塊中的 MAR channelMAR channel name:或MAR channel ID:與RELEASE_BRANCH一致對應(yīng)清單目錄下每個update.xml的hashValue和size與該 MAR 文件實(shí)際的 sha512、字節(jié)數(shù)一致且hashFunctionsha512。此外腳本會解包zen.linux-x86_64.tar.xz/zen.linux-x86_64.tar.xz檢查其中update-settings.ini的ACCEPTED_MAR_CHANNEL_IDS逗號分隔列表是否包含當(dāng)前 channel。結(jié)果判斷每項(xiàng)檢查輸出[ OK ]或[FAIL]全部通過時最后打印Pre-release verification passed.有失敗則打印Pre-release verification FAILED with N issue(s).并以非零碼退出——腳本頭注釋說明這樣可以讓 CI 在用一個損壞的發(fā)布覆蓋正常發(fā)布之前停下。校驗(yàn)產(chǎn)生的臨時目錄build/signing/nss_verify/、build/signing/extracted_linux/由 trap 在退出時自動刪除。更換簽名證書的已知邊界倉庫中的補(bǔ)丁 override_cert_checks_temp.patch 的注釋說明了換證書的后果允許證書的登記值只由安裝器寫入簽名證書變更后已有安裝仍指向舊證書維護(hù)服務(wù)會拒絕新簽名的二進(jìn)制更新會退回每次請求提權(quán)的模式。該補(bǔ)丁目前用ZEN_SKIP_ALLOWED_CERTIFICATE_CHECK暫時跳過這項(xiàng)檢查注釋要求在所有安裝完成遷移后移除。因此更換簽名證書不只是重跑-g、-i、-s還需要考慮存量安裝的這一過渡狀態(tài)?!久赓M(fèi)下載鏈接】desktopWelcome to a calmer internet項(xiàng)目地址: https://gitcode.com/GitHub_Trending/desktop70/desktop創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考