如何在macOS开发中给 PKG 签名和公证(productsign+notarytool)

在这里插入图片描述
在macOS中,给PKG文件进行签名是一个确保用户能够顺利无警告地安装软件的重要步骤。以下是给PKG签名的详细步骤:

一、准备阶段

  1. 获取开发者账号和证书

    • 首先,需要在苹果开发者网站(Apple Developer)注册一个有效的开发者账号。
    • 登录开发者账号后,进入“Certificates, IDs & Profiles”页面。
    • 创建并下载“Developer ID Application”证书和“Developer ID Installer”证书。这两个证书分别用于签名应用程序和PKG安装包。
    • 将下载的证书双击安装到“钥匙串访问”中。
  2. 打包PKG文件

    • 使用Packages工具或其他打包工具,将需要分发的应用程序和相关文件打包成一个PKG安装包。
    • 在打包过程中,可以添加安装前和安装后的脚本来执行一些自定义操作。

二、签名阶段

  1. 获取证书名称

    • 打开终端,输入命令security find-identity -v,列出所有已安装的证书。
    • 找到与“Developer ID Installer”相关的证书名称,通常格式为“Developer ID Installer: 开发者名称 (证书标识符)”。
  2. 签名PKG文件

    • 使用productsign命令对PKG文件进行签名。命令格式如下:
      productsign --sign "Developer ID Installer: 开发者名称 (证书标识符)" 原始PKG文件路径 签名后的PKG文件路径
      
    • 例如:
      productsign --sign "Developer ID Installer: Your Company, Co., LTD (2988ZTAM4B)" App.pkg App-Signed.pkg
      
    • 这将生成一个新的签名后的PKG文件。

三、验证签名

  1. 验证PKG文件签名
    • 使用pkgutil命令验证PKG文件的签名是否有效。命令格式如下:
      pkgutil --check-signature 签名后的PKG文件路径
      
    • 如果签名有效,命令将输出“signed by a developer certificate issued by Apple for distribution”。

四、公证阶段(可选)

从macOS 10.14.5开始,苹果要求所有分发的软件都必须经过公证(Notarization)。公证过程如下:

  1. 准备已签名的软件包
    在公证之前,你需要确保你的 .pkg 文件已经使用 codesign 命令进行了签名。

  2. 将公证凭证存储到 macOS 的钥匙串中

    xcrun notarytool store-credentials "$KEYCHAIN_PROFILE" \--apple-id "$APPLE_ID" \--team-id "$TEAM_ID" \--password "$APP_SPECIFIC_PASSWORD"
    
  3. 上传PKG文件到苹果服务器
    使用 notarytool 提交你的软件包进行公证。这一步会将你的软件包上传到 Apple 的公证服务,并启动公证流程。

    xcrun notarytool submit /path/to/your/signed/package.pkg --keychain-profile $KEYCHAIN_PROFILE --wait
    
    • /path/to/your/signed/package.pkg 是你的已签名软件包的路径。
    • --keychain-profile 参数用于指定包含你签名证书的钥匙串配置文件(可选,如果证书在默认钥匙串中则不需要)。
    • --wait 参数告诉 notarytool 等待公证完成并返回结果。

    如果公证成功,notarytool 会返回一个 RequestUUID,你可以使用这个 UUID 来查询公证状态或进行后续操作。

  4. 检查公证结果(如果未使用 --wait):
    如果你没有使用 --wait 参数,你需要使用返回的 RequestUUID 来检查公证状态。

    xcrun notarytool status <RequestUUID>
    

    替换 <RequestUUID> 为你实际获得的 UUID。

五、盖章步骤

一旦你的软件包通过了公证,你就可以使用 stapler 工具对其进行盖章。

  1. 对软件包进行盖章
    使用 stapler 工具对你的软件包进行盖章,以表明它已经通过了 Apple 的公证服务。

    xcrun stapler staple /path/to/your/signed/package.pkg
    
    • /path/to/your/signed/package.pkg 是你的已签名且已公证的软件包的路径。
  2. 验证盖章结果(可选):
    你可以使用 stapler 工具来验证你的软件包是否已经被正确盖章。

    xcrun stapler validate /path/to/your/stapled/package.pkg
    
    • /path/to/your/stapled/package.pkg 是你的已盖章软件包的路径。

如果所有步骤都成功完成,你的软件包现在应该已经准备好分发给用户了。用户可以通过 macOS 的“安装未知开发者应用”的安全设置来安装你的软件包,而不会因为未经验证的应用程序而被阻止。

六、命令集合

以下是一个简要的流程,以及一个相应的 .sh 脚本示例:
1.用于签名.pkg 文件(productsign.sh)。

#!/bin/bash# 证书名称,使用"security find-identity -v"命令查找并替换
CERT_NAME="Developer ID Installer: Your Company Co., Ltd. (4H8C8HR626)"# 原始PKG文件路径,替换为你的PKG文件路径
PKG_PATH="Install App.pkg"# 签名后的PKG文件路径,替换为你想要保存的签名PKG文件路径
SIGNED_PKG_PATH="../Install App.pkg"# 签名PKG文件
echo "正在签名PKG文件..."
productsign --sign "$CERT_NAME" "$PKG_PATH" "$SIGNED_PKG_PATH"
if [ $? -ne 0 ]; thenecho "签名PKG文件失败"exit 1
fi
echo "PKG文件签名成功"# 验证签名
echo "正在验证PKG文件签名..."
pkgutil --check-signature "$SIGNED_PKG_PATH"
if [ $? -ne 0 ]; thenecho "验证PKG文件签名失败"exit 1
fi
echo "PKG文件签名验证成功"
echo "所有脚本执行成功!"

2.用于签名和公证 .pkg 文件(productsign-online-notarytool.sh)。

#!/bin/bash# 证书名称,使用"security find-identity -v"命令查找并替换
CERT_NAME="Developer ID Installer: Your Company Co., Ltd. (4H8C8HR626)"
# 开发者团队ID
# 从CERT_NAME中提取TEAM_ID
# 假设TEAM_ID总是位于最后一对括号内
# TEAM_ID="4H8C8HR626"
TEAM_ID=$(echo "$CERT_NAME" | awk -F'[()]' '{print $2}')# 原始PKG文件路径,替换为你的PKG文件路径
PKG_PATH="Install App.pkg"# 签名后的PKG文件路径,替换为你想要保存的签名PKG文件路径
SIGNED_PKG_PATH="../Install App.pkg"# 应用的Bundle ID,替换为你的应用的Bundle ID
APP_BUNDLE_ID="com.company.pkg.InsallApp"# 苹果开发者账号
APPLE_ID="apple@163.com"# 应用专属密码(不是账号的登录密码),替换为你的应用专属密码
APP_SPECIFIC_PASSWORD="wet-erwc-ssdf-hqaf"KEYCHAIN_PROFILE="my_notary_credentials"            # 钥匙串配置文件名称# 签名PKG文件
echo "正在签名PKG文件..."
productsign --sign "$CERT_NAME" "$PKG_PATH" "$SIGNED_PKG_PATH"
if [ $? -ne 0 ]; thenecho "签名PKG文件失败"exit 1
fi
echo "PKG文件签名成功"# 验证签名
echo "正在验证PKG文件签名..."
pkgutil --check-signature "$SIGNED_PKG_PATH"
if [ $? -ne 0 ]; thenecho "验证PKG文件签名失败"exit 1
fi
echo "PKG文件签名验证成功"# ==== Xcode 16 ===
# 存储公证凭证到钥匙串
echo "正在存储公证凭证..."
xcrun notarytool store-credentials "$KEYCHAIN_PROFILE" \--apple-id "$APPLE_ID" \--team-id "$TEAM_ID" \--password "$APP_SPECIFIC_PASSWORD"
if [ $? -ne 0 ]; thenecho "存储凭证失败!"exit 1
fi# 上传PKG文件进行公证并获取RequestUUID
echo "正在上传PKG文件进行公证, 请稍等..."
OUTPUT=$(xcrun notarytool submit "$SIGNED_PKG_PATH" \--keychain-profile "$KEYCHAIN_PROFILE" \--wait 2>&1)echo "上传输出信息:"
echo "$OUTPUT"# 检查是否成功获取到RequestUUID
REQUEST_UUID=$(echo "$OUTPUT" | awk -F': ' '/id: / {print $2; exit}')
if [ -z "$REQUEST_UUID" ]; thenecho "上传PKG文件进行公证失败,未获取到RequestUUID"echo "错误信息: $OUTPUT"exit 1
fi
echo "PKG文件已上传进行公证,RequestUUID: $REQUEST_UUID"# 查询公证进度
echo "正在等待公证完成..."
WAIT_TIME=0
INTERVAL=30
MAX_WAIT_TIME=100 # 10分钟=600秒
while [ $WAIT_TIME -lt $MAX_WAIT_TIME ]; doxcrun notarytool info "$REQUEST_UUID" --keychain-profile "$KEYCHAIN_PROFILE" > ./notary_info.logSTATUS=$(grep -i "status:" ./notary_info.log | awk -F': ' '{print $2}')ERROR=$(grep -i "error:" ./notary_info.log | awk -F': ' '{print $2}')if [ "$STATUS" == "Accepted" ]; thenecho "公证完成!"breakelif [ "$STATUS" == "Success" ]; thenecho "公证成功!"breakelif [ "$STATUS" == "invalid" ]; thenecho "公证失败,状态为无效!"exit 1elseecho "公证进行中($WAIT_TIME)..."echo "等待$INTERVAL 秒后再次检查..."sleep $INTERVALWAIT_TIME=$((WAIT_TIME + INTERVAL))fiif [ $WAIT_TIME -ge $MAX_WAIT_TIME ]; thenecho "公证超时!"exit 1fi
done# 盖章
echo "正在对签名的安装包进行盖章..."
xcrun stapler staple "$SIGNED_PKG_PATH"
if [ $? -ne 0 ]; thenecho "盖章失败!"
elseecho "盖章成功!"exit 1
fi# 验证
echo "正在验证已经盖章的签名的安装包..."
xcrun stapler staple -v "$SIGNED_PKG_PATH"
if [ $? -ne 0 ]; thenecho "验证失败!"exit 1
elseecho "盖章和验证成功!"
fiecho "PKG文件签名和公证流程全部完成"
echo "所有脚本执行成功!"

请注意,这些步骤假设你已经具备了必要的 Apple Developer 账户、证书和配置文件,并且你的 macOS 系统已经安装了 Xcode 和 Xcode Command Line Tools。如果你遇到任何问题,请检查你的证书、配置文件和路径是否正确,以及你是否拥有执行这些命令的适当权限。

cd build
chmod +x productsign.sh
chmod +x productsign-online-notarytool.sh
./productsign.sh  #或者仅签名
./productsign-online-notarytool.sh # 或者签名加公正[用于需要自动更新]

在这里插入图片描述

参考:

https://taoofcoding.tech/blogs/2022-11-13/use-notarytool-to-notary-macos-app
https://blog.csdn.net/Crystal_Mr_Rose/article/details/136351429

macOS 工具 - 查看PKG文件内容, App下载安装
SuspiciousPackage官方下载地址(免费):
http://www.mothersruin.com/software/SuspiciousPackage/get.html

Mac OS平台下应用程序PKG安装包制作工具Packages, App下载安装
Packages官方下载地址(免费):
http://s.sudre.free.fr/Software/Packages/resources.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EtherNet转Profinet主站网关以太网总线协议转换模块一文即可搞懂

稳联技术(WL-ABC2006)EtherNet/IP转Profinet网关是一种工业网络设备&#xff0c;它能够实现两种不同工业以太网协议之间的数据交换和通信。这种网关在工业自动化领域中非常重要&#xff0c;因为它允许不同品牌和协议的设备之间进行互联互通&#xff0c;从而提高了系统的灵活性和…

计算机网络:网络层 —— IPv4 协议的表示方法及其编址方法

文章目录 IPv4IPv4的表示方法IPv4的编址方法分类编址A类地址B类地址C类地址可指派的地址数量一般不使用的特殊IPv4地址 划分子网编址子网掩码默认子网掩码 无分类编址方法地址掩码斜线记法无分类域间路由选择 CIDR IPv4 IPv4&#xff08;Internet Protocol version 4&#xff…

rtp协议:rtcp包发送和接收规则和报告!

RTCP Packet Send and Receive Rules&#xff1a; 发送和接收 RTCP 包的规则在此列出。允许在多播环境或多点单播环境中运行的实现必须满足第 6.2 节中的要求。这样的实现可以使用本节定义的算法来满足这些要求&#xff0c;或者可以使用其他算法&#xff0c;只要其性能等同或更…

详细解读 CVPR2024:VideoBooth: Diffusion-based Video Generation with Image Prompts

Diffusion Models专栏文章汇总:入门与实战 前言:今天是程序员节,先祝大家节日快乐!文本驱动的视频生成正在迅速取得进展。然而,仅仅使用文本提示并不足以准确反映用户意图,特别是对于定制内容的创建。个性化图片领域已经非常成功了,但是在视频个性化领域才刚刚起步,这篇…

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具&#xff0c;不仅可以筛选内容&#xff0c;而且可以筛选颜色&#xff0c;例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格&#xff08;下图右侧所示&#xff09;&#xff0c;其他单元格的填充色不固定&#xff0c;有几种颜色…

什么是元件符号什么是封装

话不多说直接上图 左上角就可以理解为元件的符号&#xff0c;右上角可以理解为元件的封装&#xff0c;右下角是封装得3D图&#xff0c;左下角是真实的芯片。 同时注意我们元件符号的小孔&#xff0c;在封装和焊接时我们可以参照小孔的位置以及对应的引脚。如下图所示&#xff…

网站保护神器,雷池社区版的隐藏文件

SafeLine&#xff0c;中文名 “雷池”&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击。 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、XSS、 代码注入、命…

2024双十一值得入手的好物推荐,双十一必买好物清单详细攻略分享

随着双十一购物狂欢节的临近&#xff0c;广大消费者又开始了一年一度的购物盛宴&#xff0c;在这个全民狂欢的时刻&#xff0c;如何在众多商品中挑选出真正值得入手的好物&#xff0c;成为了许多人的难题。为了帮助大家在这个双十一期间理性消费&#xff0c;挑选到真正适合自己…

AI图片生成3D物体和2D视频提取3D动画

包括AI图片生成3D物体的网站&#xff1a; 第一个为Artefacts.AIhttps://app.artefacts.ai/starter 第二个为 https://3d.csm.ai/ 以下4个的视频教程连接https://www.youtube.com/watch?vmQQCyzTA_F8 第三个为Tripo AI: Tripo AI for Web 第四个为Meshy AI: Meshy - Free …

驾校管理系统|基于java和小程序的驾校管理系统设计与实现(源码+数据库+文档)

驾校管理系统平台 目录 基于java和小程序的驾校管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#…

江协科技STM32学习- P23 DMA 直接存储器存取

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

数据结构与算法(二叉树)

树 树的概念与结构 1. 树是⼀种非线性的数据结构&#xff0c;它是由 n 个有限结点组成的⼀个具有层次关系的集合。 2. 之所以把它叫做树&#xff0c;是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下。 2. 有⼀个特殊的结点&#xff0c;称为根…

HarmonyOS应用开发者基础认证——初级闯关习题参考答案大全

相关文章 HarmonyOS应用开发者中级认证——中级闯关习题参考答案大全 HarmonyOS应用开发者高级认证——高级闯关习题参考答案大全 文章目录 HarmonyOS第一课 HarmonyOS介绍判断题单选题多选题 HarmonyOS第一课 DevEco Studio的使用判断题单选题多选题 HarmonyOS第一课 ArkTS语法…

浅析Android View绘制过程中的Surface

前言 在《浅析Android中View的测量布局流程》中我们对VSYNC信号到达App进程之后开启的View布局过程进行了分析&#xff0c;经过对整个App界面的View树进行遍历完成了测量和布局&#xff0c;确定了View的大小以及在屏幕中所处的位置。但是&#xff0c;如果想让用户在屏幕上看到…

使用 FastGPT 工作流实现 AI 赛博算卦,一键生成卦象图

最近那个男人写的汉语新解火遍了全网&#xff0c;那个男人叫李继刚&#xff0c;国内玩 AI 的同学如果不知道这个名字&#xff0c;可以去面壁思过了。 这个汉语新解的神奇之处就在于它只是一段几百字的提示词&#xff0c;效果却顶得上几千行代码写出来的应用程序。 这段提示词…

面试域——岗位职责以及工作流程

摘要 介绍互联网岗位的职责以及开发流程。在岗位职责方面&#xff0c;详细阐述了产品经理、前端开发工程师、后端开发工程师、测试工程师、运维工程师等的具体工作内容。产品经理负责需求收集、产品规划等&#xff1b;前端专注界面开发与交互&#xff1b;后端涉及系统架构与业…

【STM32-HAL库】火焰传感器(STM32F407ZGT6)(附带工程下载链接)

一、TEMT6000光照强度传感器 火焰传感器是一种能够检测火焰的传感器&#xff0c;它通过检测空气中的特定波长的光线来检测火焰的存在&#xff0c;并输出一个信号来通知系统发生了火灾 工作原理 火焰传感器的工作原理基于光学检测技术。当火焰燃烧时&#xff0c;会产生一些特…

Python 实现 excel 数据过滤(从入门到exe)

一、场景分析 假设有如下一份 excel 数据 shop.xlsx, 写一段 python 程序&#xff0c;实现对于车牌的分组数据过滤。 并以车牌为文件名&#xff0c;把店名输出到 车牌.txt 文件中。 比如 闽A.txt 文件内容为&#xff1a; 小林书店福州店1 小林书店福州店2 二、依赖安装 程序依…

乘云而上,OceanBase再越山峰

一座山峰都是一个挑战&#xff0c;每一次攀登都是一次超越。 商业数据库时代&#xff0c;面对国外数据库巨头这座大山&#xff0c;实现市场突破一直都是中国数据库产业多年夙愿&#xff0c;而OceanBase在金融核心系统等领域的攻坚克难&#xff0c;为产业突破交出一副令人信服的…

消防应急救援系留照明无人机技术详解

消防应急救援系留照明无人机技术是一种专门用于消防应急救援场景&#xff0c;通过系留技术实现长时间悬停并提供高效照明服务的高科技解决方案。以下是对该技术的详细解析&#xff1a; 一、系统组成 消防应急救援系留照明无人机系统主要由无人机平台、LED照明灯组、系留供电系…