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