尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Zen Browser 更新包 MAR 怎么签名并做发布前校验:mar_sign.sh 与 mar_verify.sh 的用法

Zen Browser 更新包 MAR 怎么签名并做发布前校验:mar_sign.sh 与 mar_verify.sh 的用法 Zen Browser 更新包 MAR 怎么签名并做发布前校验mar_sign.sh 与 mar_verify.sh 的用法【免费下载链接】desktopWelcome to a calmer internet项目地址: https://gitcode.com/GitHub_Trending/desktop70/desktop发布 Zen Browser 时各平台的 MAR 更新包如linux.mar/linux.mar必须先签名签名后的文件 hash 和大小会变化配套的update.xml清单也要同步更新在正式发布前还需要一次独立校验确认签名、MAR channel 和清单三者一致。仓库提供了两个脚本来完成这件事scripts/mar_sign.sh 负责生成证书、把证书导入 updater 和签名scripts/mar_verify.sh 负责发布前校验。下面按执行顺序说明两个脚本的用法、所需环境变量和结果判断。前置条件以下内容来自脚本自身的检查逻辑和错误提示一个由引擎构建产物提供的signmar二进制并通过SIGNMAR环境变量指向它的路径否则-s会报Error: signmar not found at $SIGNMAR. Build the engine first.openssl以及 NSS 工具certutil、pk12utilhash 计算使用sha512sum不可用时回退到shasum -a 512各平台的.mar文件已放在脚本会扫描的目录中见「签名 MAR 包」一节运行mar_verify.sh时还需要RELEASE_BRANCH环境变量release或twilight以及工作目录中的 Linux 安装包zen.linux-x86_64.tar.xz/zen.linux-x86_64.tar.xz用于校验其中的update-settings.iniupdater 二进制链接了nss和signmar见 updater-common-build.patchLinux 下补丁追加了 RPATH 以便运行时找到 NSS/signmar 库生成签名证书mar_sign.sh -g-g会生成三样东西全部落在build/signing/下private_key.pem4096 位 RSA 私钥cert.pem自签名证书主题CNMAR Signing有效期设为脚本注释中标注的 RFC 5280 “no well-defined expiration” 哨兵值99991231235959Zpublic_key.der导出为 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 以后续环境变量的方式注入签名材料。scripts/mar_sign.sh -g副作用脚本会创建temp/目录并在用完后rm -rf删除。脚本注释明确说明public_key.der是唯一应当分发并嵌入 updater 的文件私钥和完整证书不应流出。把证书导入 updatermar_sign.sh -i要求先跑过-g缺少build/signing/public_key.der时会报Run with -g first.。-i会把public_key.der复制到engine/toolkit/mozapps/update/updater/下的 5 个证书文件release_primary.derrelease_secondary.derdep1.derdep2.derxpcshellCertificate.der注意脚本对每个文件是先用rm -f删除再复制即这些路径上原有的旧证书会被直接替换scripts/mar_sign.sh -i输出最后一行就是下一步动作Done. Rebuild the updater to embed the new certificate.需要重新构建 updater新证书才会真正生效。签名 MAR 包mar_sign.sh -s-s会对当前目录下各平台目录中的所有.mar文件就地签名。运行前注意它的副作用每个.mar先签成*.mar.signed再原样覆盖回原文件对应清单目录下的update.xml会被sed -i改写替换hashValue和size两个属性签名结束后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替换为你引擎构建产物中 signmar 二进制的实际路径。环境变量ZEN_MAR_SIGNING_PASSWORDPKCS#12 打包用的密码。未设置时脚本会打印警告并使用空密码。ZEN_SIGNING_CERT_PEM_BASE64/ZEN_SIGNING_PRIVATE_KEY_PEM_BASE64设置后会被 base64 解码写入build/signing/cert.pem和build/signing/private_key.pem适合 CI 注入签名材料未设置时则直接使用-g生成并留在磁盘上的这两个 PEM 文件。脚本按目录是否存在来扫描以下平台目录不存在或其中没有.mar文件会报错并以非零码退出MAR 所在目录对应清单目录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子目录。每个文件的实际签名命令是$SIGNMAR -d $NSS_CONFIG_DIR -n mar_sig -s $mar_file $mar_file.signedNSS 数据库build/signing/nss_config由脚本用certutil -N创建私钥加证书以名称mar_sig打包成 PKCS#12 并经pk12util导入。签名完成后脚本立即用signmar -v复核一次然后调用update_manifests因为签名会改变文件的 hash 和大小脚本用新文件的sha512sum与字节数替换清单中每个update.xml的hashValue和size属性。脚本自身的提示消息每个文件一组Signing ...、Signed ... Verifying signature...、Successfully signed ...、Manifest updated with new hashValue and size for ...。发布前校验mar_verify.sh按 scripts/mar_verify.sh 头部注释这一步在scripts/mar_sign.sh -s之后、发布之前运行。它会建一个一次性的 NSS 数据库只信任build/signing/public_key.der这样不需要私钥就能验证签名SIGNMAR/path/to/signmar RELEASE_BRANCHrelease scripts/mar_verify.shRELEASE_BRANCH必须非空取值release或twilightSIGNMAR同样替换为 signmar 的实际路径。对每个 MAR校验内容固定为四项文件存在且非空signmar -v验证签名通过输出Signature valid: marsignmar -T显示恰好一个签名块Signature block found with 1 signature且产品信息块中的 MAR channelMAR channel name:或MAR channel ID:与RELEASE_BRANCH一致对应清单目录下每个update.xml的hashValue和size与该 MAR 文件实际的 sha512、字节数一致且hashFunctionsha512。此外脚本会解包zen.linux-x86_64.tar.xz/zen.linux-x86_64.tar.xz检查其中update-settings.ini的ACCEPTED_MAR_CHANNEL_IDS逗号分隔列表是否包含当前 channel。结果判断每项检查输出[ OK ]或[FAIL]全部通过时最后打印Pre-release verification passed.有失败则打印Pre-release verification FAILED with N issue(s).并以非零码退出——脚本头注释说明这样可以让 CI 在用一个损坏的发布覆盖正常发布之前停下。校验产生的临时目录build/signing/nss_verify/、build/signing/extracted_linux/由 trap 在退出时自动删除。更换签名证书的已知边界仓库中的补丁 override_cert_checks_temp.patch 的注释说明了换证书的后果允许证书的登记值只由安装器写入签名证书变更后已有安装仍指向旧证书维护服务会拒绝新签名的二进制更新会退回每次请求提权的模式。该补丁目前用ZEN_SKIP_ALLOWED_CERTIFICATE_CHECK暂时跳过这项检查注释要求在所有安装完成迁移后移除。因此更换签名证书不只是重跑-g、-i、-s还需要考虑存量安装的这一过渡状态。【免费下载链接】desktopWelcome to a calmer internet项目地址: https://gitcode.com/GitHub_Trending/desktop70/desktop创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表