如何在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.rhkb.cn/news/459137.html

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

相关文章

Linux系统下minio设置SSL证书进行HTTPS远程连接访问

文章目录 1.配置SSL证书使用HTTPS访问2.MINIO SDK 忽略证书验证3.使用受信任的证书 1.配置SSL证书使用HTTPS访问 生成域名对应的SSL证书&#xff0c;下载Apache版本&#xff0c;我目前只发现Apache这个里面有对应的私钥和证书 私钥重命名为private.key证书重命名为public.crt&…

AtCoder ABC376A-D题解

个人觉得 ABC 变得越来越难了/kk/kk/kk 比赛链接:ABC376 Problem A: Code #include <bits/stdc.h> using namespace std; int main(){int N,C;cin>>N>>C;for(int i1;i<N;i)cin>>T[i];int ans0,pre-1e5;for(int i1;i<N;i){if(T[i]-pre>C){…

Java:String类(超详解!)

一.常用方法 &#x1f94f;1.字符串构造 字符串构造有三种方法&#xff1a; &#x1f4cc;注意&#xff1a; 1. String是引用类型&#xff0c;内部并不存储字符串本身 如果String是一个引用那么s1和s3应该指向同一个内容&#xff0c;s1和s2是相等的&#xff0c;应该输出两…

使用Django框架开发企业级Web应用

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用Django框架开发企业级Web应用 1 引言 2 Django简介 3 安装Python与Django 4 创建Django项目 5 设计应用结构 6 创…

行业首发|美格智能创新推出5G+Wi-Fi 7智能终端解决方案,端侧AI助力数智升维

在数字化时代的生产生活过程中&#xff0c;特殊场景下的通信需求愈发重要。高速、灵活、稳定的通信保障能够进一步提升生产生活的效率。随着5G网络的高速发展&#xff0c;一方面&#xff0c;其凭借低时延、高带宽、高可靠性和大规模连接的特性让移动终端的网络连接实现跨越式升…

UML总结

零&#xff1a;学习链接 UML_哔哩哔哩_bilibili 一&#xff1a;UML概述 二&#xff1a;类图 类图&#xff08;Class Diagram&#xff09;是统一建模语言&#xff08;UML&#xff09;中一种重要的图形表示&#xff0c;用于描述系统中的类及其之间的关系。它是面向对象设计中常…

基于SSM+微信小程序考试的管理系统(考试1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序考试的管理系统实现了管理员及用户。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;考试资料管理&#xff0c;用户交流管理&#xff0c;试卷管理&#xff…

大数据日志处理框架ELK方案

介绍应用场景大数据ELK日志框架安装部署 一&#xff0c;介绍 大数据日志处理框架ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;是一套完整的日志集中处理方案&#xff0c;以下是对其的详细介绍&#xff1a; 一、Elasticsearch&#xff08;ES&#xff09; 基本…

ZEISS ATOS Q蓝光三维扫描仪高效把控零件质量检测【上海沪敖3D】

位于Bengaluru的施耐德电气工厂拥有一流的计量设备&#xff0c;可以检测所有供应商的零件。当时&#xff0c;他们在使用一款激光扫描设备进行质量检测&#xff0c;但是&#xff0c;该设备不便于携带&#xff0c;且检测时需要喷涂大量的显影液。此外&#xff0c;它需要被安装在夹…

LeetCode--买卖股票的最佳时机Ⅲ--动态规划

一、题目解析 二、算法原理 这道题跟另外的几道股票问题分析方式相似&#xff0c;区别主要就在于该题规定我们最多可以完成两笔交易&#xff0c;那么我们就可以定义二维数组f[][]&#xff0c;g[][]。f[i][j]表示在第i天后我们手中持有股票且交易次数为j时的最大利润&#xff0c…

微服务之网关、网关路由、网关登录校验

简介&#xff1a;来源&#xff1a;SpringCloud微服务开发与实战&#xff0c;java黑马商城项目微服务实战开发&#xff08;涵盖MybatisPlus、Docker、MQ、ES、Redis高级等&#xff09; 认识网关 前端请求不能直接访问微服务&#xff0c;而是要请求网关&#xff1a; 网关可以做…

JetBrains IDE中GPU进程(JCEF)重启问题(Too many restarts of GPU-process)解决方案

目录 前言1. GPU进程重启问题概述1.1 什么是GPU进程重启问题&#xff1f;1.2 该问题带来的影响 2. GPU进程重启问题的原因分析2.1 显卡驱动的兼容性问题2.2 系统资源的限制2.3 JCEF组件的设置不合理 3. 解决方案3.1 方法一&#xff1a;通过自定义属性禁用GPU加速3.2 方法二&…

CRC校验 生成多项式选取奇次偶次的问题讨论

目录 问题一&#xff1a;为什么CRC校验码不支持偶次校验码&#xff1f; 问题二&#xff1a;如何判断一个生成多项式是否为偶次多项式&#xff1f; 步骤&#xff1a; 示例&#xff1a; 注意&#xff1a; 问题三&#xff1a;CRC32的生成多项式是什么&#xff1f;是偶次还是…

Python自动打开本地谷歌浏览器—无需下载驱动器(模板—自己的笔记)

目录 专栏导读1、库的介绍2、库的安装3、核心代码4、完整1&#xff1a;自动打开本地谷歌浏览器5、使用Selenium连接到远程调试端口总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博…

电气安全隐患不容忽视

在现代生活中&#xff0c;电力如同血液般滋养着城市的每一个角落&#xff0c;然而&#xff0c;当这股能量失控时&#xff0c;它也能瞬间化身为吞噬生命的火焰。根据国家消防局的权威数据&#xff0c;电气火灾占所有火灾的28.4%&#xff0c;而其中6.5%的源头直指短路——这一看似…

WebSocket—双向实时通信

WebSocket 是一种用于建立客户端和服务器之间的全双工通信协议。它允许在同一连接上进行双向数据传输&#xff0c;特别适合实时性要求高的应用场景&#xff0c;如即时聊天、实时通知和在线游戏等。WebSocket 使用 HTTP 握手建立连接&#xff0c;一旦连接建立&#xff0c;数据可…

014:数据恢复软件iCare Data Recovery安装教程

摘要&#xff1a;本文详细介绍数据恢复软件iCare Data Recovery安装流程。 一、软件介绍 iCare Data Recovery Pro是一款专业且高效的数据恢复软件&#xff0c;专为解决各种数据丢失问题而设计。该软件具备强大的扫描和恢复功能&#xff0c;能够深入查找并恢复包括文档、图片、…

【移动应用开发】Android持久化技术

目录 一、实现一个“我的图书馆” 1. 用户登陆界面 1.1 运行截图 1.2 源代码 ① 布局文件activity_login.xml ② res/values/strings.xml ③ LoginActivity.kt ④ 在AndroidManifest.xml注册LoginActivity.kt 2. 图书信息数据库和显示界面 2.1 功能实现截图 2.2 源…

商用加密机:信息安全的重要保障

在当今这个数字化时代&#xff0c;信息的安全传输和存储成为了各行各业不可忽视的重要问题。随着网络技术的迅猛发展&#xff0c;各种数据泄露、网络攻击事件层出不穷&#xff0c;信息安全威胁日益严峻。为了应对这一挑战&#xff0c;商用加密机作为一种重要的信息安全设备&…

Vxe UI vue vxe-table 表格中使用下拉表格,单元格渲染下拉表格

Vxe UI vue vxe-table 表格中使用下拉表格&#xff0c;单元格渲染下拉表格 单元格中渲染下拉表格&#xff0c;需要使用到 vxe-table-select 这个组件&#xff0c;在 vxe-table 4.7 中使用非常简单&#xff0c;只需要配置好渲染器数据源就可以。 支持单选 也可以多选 代码 …