iOS 包签名及重签名

签名相关的命令:
•$security find-identity -v -p codesigning -- 列出钥匙串里可签名的证书

  **$ security find-identity -v -p codesigning 
  1) 19F788D97B9D207BC51880CD16D27E3155EAD07A "iPhone Developer: ** (7T2P6H6P38)" (CSSMERR_TP_CERT_REVOKED)
  2) 30C568C3A80F3B0AA377E0F5C62D809B32570A0E "iPhone Distribution: China ** Bank Co., Ltd (GE82RV5YC2)"
  3) CBBA636E393834755573D184BE2557EA3FF218D4 "iPhone Distribution: Guangzhou ** Tech Co., Ltd."
  4) 8D5A4F69733DBF227DEBF8965FDA97B469D9C9A1 "iPhone Developer: ** (7T2P6H6P38)"
  5) E9399B8E9B995957857CA90003DF21E4C97BF354 "Mac Developer: **@163.com (F98N8WBRR3)"
     5 valid identities found

•$security cms -D -i embedded.mobileprovision -- 查看描述文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>AppIDName</key>     
    <string>combase</string>
    <key>ApplicationIdentifierPrefix</key>
    <array>
    <string>ZCGJEL3KM8</string>
    </array>
    <key>CreationDate</key>  // 描述文件创建的信息
    <date>2019-05-16T02:31:49Z</date>
    <key>Platform</key>
    <array>
        <string>iOS</string>
    </array>
    <key>IsXcodeManaged</key>
    <false/>
    <key>DeveloperCertificates</key>
    <array>
        <data>MIIFsjCCBJqgAwIBAgIIAy6HjoOMbQcwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTkwNTE1MDMxNjU0WhcNMjIwNTE0MDMxNjU0WjCBszEaMBgGCgmSJomT8ixkAQEMClpDR0pFTDNLTTgxQzBBBgNVBAMMOmlQaG9uZSBEaXN0cmlidXRpb246IEd1YW5nemhvdSBFdG9wIERpZ2l0YWwgVGVjaCBDby4sIEx0ZC4xEzARBgNVBAsMClpDR0pFTDNLTTgxLjAsBgNVBAoMJUd1YW5nemhvdSBFdG9wIERpZ2l0YWwgVGVjaCBDby4sIEx0ZC4xCzAJBgNVBAYTAkNOMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0b8v7AY7dVz6j3vjcAks30v5nE0JUmehRv28RpPWu30bNEHGWXU4yGlf4EfJVZ2HuMQSUGScSmqlp9bbUTfr4Sx9f+Qw6rCSz0W7Z6+BOYARaNZR96LWJ/A8WbF+974IDrkqGUmVZsBUYsCgilyi5uQDy05hqiEpkXKLoR8SsjCuw3hVeE8Lnx1nRweYmzijprkwSTWnCBnngPLrAOy3ayktYVjxoCHlMOd5sl8loQFpfIckiUe8V/LJvmCO97JV5igS+TsyywDFgXADcwnfeajuZKfAfXd9pCg+A+08uIY7I2/btwQM4r9ejssIne/r7XUAwI0jDJlNAcFPZdzsqwIDAQABo4IB4zCCAd8wDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBSIJxcJqbYYYIvs67r2R1nFUlSjtzA/BggrBgEFBQcBAQQzMDEwLwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwLmFwcGxlLmNvbS9vY3NwMDItd3dkcjAxMIIBDwYDVR0gBIIBBjCCAQIwgf8GCSqGSIb3Y2QFATCB8TCBwwYIKwYBBQUHAgIwgbYMgbNSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRlIHBvbGljeSBhbmQgY2VydGlmaWNhdGlvbiBwcmFjdGljZSBzdGF0ZW1lbnRzLjApBggrBgEFBQcCARYdaHR0cDovL3d3dy5hcHBsZS5jb20vYXBwbGVjYS8wFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwMwHQYDVR0OBBYEFGmKEMbe+XvrlksrnVA5Kz5CpT67MA4GA1UdDwEB/wQEAwIHgDATBgoqhkiG92NkBgEEAQH/BAIFADANBgkqhkiG9w0BAQUFAAOCAQEAjinFdmlQ8BpedJhYEksVXsFoToRdSUvfeS+UKz2OO6T0iFe6MI4rtvgrGy4HdeClcY028yKepyQ+mT0gdfqsV4kcx55UVhqfRo4krlsv8UWjHZj5FUj6rfsEmVU6m//dI7iqhVul95xvgjJICUWzHd32qww4tRECdyBUK+YyKJ6pJxlr5WIx1OpqqVv0EPPF+K9nI2z9OVy+f0CjdPooYh0isB6GAE5P/V8yMcDdzXgn3ctMI+HegMT23AJ6ORNTLOT5QEVM5/xnbB32VtPmnjP4FmRy8SWrAv3XNrU6Z8+/QTJBcGnvJmXdQj+sBKRWV7Xrsga9GfSELK+GfzVXbw==</data>
    </array>

                                                                
    <key>Entitlements</key>
    <dict>
         <key>application-identifier</key>  // 描述文件匹配的bundleid , 带星号代表 通配匹配。 
         <string>ZCGJEL3KM8.com.base.*</string>
         <key>keychain-access-groups</key>
         <array>
                <string>ZCGJEL3KM8.*</string>
        </array>
                        <key>get-task-allow</key>
        <false/>
                        <key>com.apple.developer.team-identifier</key>
        <string>ZCGJEL3KM8</string>

    </dict>
    <key>ExpirationDate</key>  // 描述文件的过期日期,过期后,通过该描述文件签名的包便不可用(上架的除外),需要重新签名
    <date>2020-05-15T02:31:49Z</date>
    <key>Name</key>  // 描述文件的名字
    <string>combaseinhouse</string>
    <key>ProvisionsAllDevices</key> // 是否为 Inhouse.  如果有该字段,并且为true 则表示无需绑定设备。 
    <true/>
    <key>TeamIdentifier</key> // 证书标识
    <array>
        <string>ZCGJEL3KM8</string>
    </array>
    <key>TeamName</key> // 证书开发团体
    <string>***  Tech Co., Ltd.</string>
    <key>TimeToLive</key>
    <integer>365</integer>
    <key>UUID</key>
    <string>b83d32b9-21b4-47e5-a9b7-e6039aca868a</string>
    <key>Version</key>
    <integer>1</integer>
</dict>

•$codesign–fs “证书串” 文件名 -- 强制替换签名

/usr/bin/codesign --force --sign "iPhone Distribution: Guangzhou Etop Digital Tech Co., Ltd."  framworkpath -- 对framework文件下的第三方库进行重签名

方法一: 手动重签名

重签步骤:
1.删除插件和带有插件的.app包(比如Watch)
2.对Frameworks里面的库进行重签名
3.给可执行文件 +x(可执行)权限
4.替换描述文件
5.替换BundleID
6.通过授权文件(Entilements)重签.app包

实际操作:
获取破壳的ipa包
获取第三方ipa包
查看ipa包是否已经破壳 》 非上架的都没加壳,无需关注
解压ipa包,进入playload文件夹,找到MachO文件

image.png

在终端使用命令otool -l DingTalk | grep crypt,0是已脱壳,大于0是未脱壳(一
般为1)

image.png

image.png

终端查看本地有效证书
$security find-identity -v -p codesigning

image.png

删除无法签名的插件文件
删除Plugins文件夹和Watch文件夹

对.app文件夹内的Frameworks文件夹中的每一个framework强制重签名
命令:$ codesign -fs "iPhone Developer: xxx " xxx.framework
找到framework文件夹下所有.framework,分别使用上面的命令对其签名。

image.png

注意不要遗漏,每一个framework都要用自己的证书重签一下

建议通过脚本命令执行:

    #! /bin/bash

echo "传入framework文件夹路径"
read TARGET_APP_FRAMEWORKS_PATH 
#到判断是否能进入到frameworks 如果能进入则 开始循环签名
if [ -d  "$TARGET_APP_FRAMEWORKS_PATH" ];
 then
    echo "进入到Framework:${TARGET_APP_FRAMEWORKS_PATH} 路径中"

    for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*; 
    do
        #签名
        /usr/bin/codesign --force --sign "iPhone Distribution: Guangzhou Etop Digital Tech Co., Ltd." "$FRAMEWORK"

        #statements
    done

fi
    #statements

将要签名的描述文件该成 embedded.mobileprovision 替换 来的 embedded.mobileprovision

创建entitlements.plist文件
查看描述文件内容,使用命令security cms -D -I embedded.mobileprovision,找到Entitlements节点,接着创建entitlements.plist文件,内容拷贝过去,最后把entitlements.plist文件拷贝到playload文件夹内(与xx.app同级)。
!](https://upload-images.jianshu.io/upload_images/1502585-e1694c8e1e77a197.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

修改xx.app包里面的info.plist中的bundleId为上面项目的bundleId

image.png

对xx.app开始签名
使用的命令: /usr/bin/codesign -fs "iPhone Developer: xx" --no-strict --entitlements=entitlements.plist xx.app 在Payload下执行该命令 ![image.png](https://upload-images.jianshu.io/upload_images/1502585-f5f56b666841f368.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) **最后 对Payload压缩下改成ipa包 就可以使用了** 可以使用zip –ry 输出文件 输入文件 命令。也可以手动压缩。

方法二 自动化脚本文件。

将上述操作 通过shell命令 写个脚本文件。然后一键操作。
shell脚本语言命令

image.png

方法三: 用第三方工具。快速搞定

地址:https://github.com/InjoyDeng/ResignTool

方法四:快速简单签名

蒲公英平台重签名

支持点补充

本文章主要介绍iOS 版本发布的两个相关功能。

一 : iOS 开发出的版本发布安装 用两种方式 :

   1   --- 证书打包安装(比较多,便不再介绍)
   2   --- 无证书打包安装 (主要用于合作开发商之间,自定义版本签名)
      具体步骤: 
      1. 首先把项目从模拟器改成通用设备(Generic iOS  Device), 然后command + B编    译项目.2.  然后在Products文件夹下, 找到我们的app, 右键show in finder.3.  把这个app包复制到桌面, 然后创建一个名字为Payload的文件夹, 这里的文件夹名字不可以是其他的名字, 必须是Payload, 否则会失败. 4, 然后把app包放进Payload文件夹内, 在把Payload文件夹压缩后更改zip格式为ipa即可.

二:iOS逆向 ipa包重签名
相关自动化签名的链接: https://zhuanlan.zhihu.com/p/23180455
转载: https://blog.csdn.net/chenyblog/article/details/78959762

软件环境
Mac: v10.12.6 (16G29)
ruby: v2.3.4
rvm: v1.29.3
sigh: v2.71.1
Xcode: v9.2

使用sigh脚本
使用之前先安装一下脚本环境

  1. 安装神器brew,没有安装的看这里:Homebrew
  2. 安装ruby,命令:brew install ruby
  3. 安装sigh,命令:sudo gem install sigh,过程比较漫长。

应用场景:
主要解决因重复打包导致测试同学回归测试的包和上传App Store的包不一致的问题。以及 合作方之间 证书不一致,需要重新签名问题。

App开发测试流程

image

分析:一般情况下,流程如下:

  1. 开发同学完成开发后,打包给测试同学测试
  2. 测试同学发现bug,然后开发同学继续开发改bug、打包
  3. 测试到一定阶段后,开发同学打包(封板),测试同学做回归测试
  4. 回归测试完成之后,开发同学再次打包上传App Store

可能存在的问题:

  • 多次打包,麻烦,编译一次的成本比想象中大
  • 多次打包,可能会导致测试同学回归测试的包和上传App Store的包不一致(!important

解决办法:

对回归测试通过的ipa包进行重新签名,然后上传 App Store

ipa包重新签名

新版本的ipa包重新签名

  1. 切换至ipa目录


    image

    xxx.ipa和xxxDistrbution.mobileprovision文件在同一目录下

  2. 在终端输入fastlane sigh resign命令

    image

    此时会看到可选择的 identities 列表

  3. Signing Identity:输入用来签名的证书标识


    image

    因为xxx.ipa和xxxDistrbution.mobileprovision文件在同一个目录下,所以省略了拖拽ipa文件和证书配置文件等步骤。

如果xxx.ipa和xxxDistrbution.mobileprovision文件不在一个目录下,你可能需要这样做:
  • 在终端输入fastlane sigh resign命令

  • Path to ipa file:

    • 输入ipa文件路径(拖拽ipa文件到终端即可)
  • Signing Identity:输入用来签名的证书标识(同上)

  • Path to provisioning file:

    • 输入.mobileprovision文件路径(拖拽.mobileprovision文件到终端即可)
  • 自动resign,成功

TIPS

输入的 Signing Identity 如果和 .mobileprovision文件 不一致,那么终端上仍会提示resign成功,但是,安装时会报错!

查看app信息(校验签名是否替换成功)

codesign -vv -d xxx.app

替换前(开发证书打的包)

image

替换后(企业证书打的包)

image

准备工作


  • 已经经过破壳处理的iTunes ipa包或者第三方越狱应用等;
  • 开发者测试证书和描述文件;
  • 签名工具:sigh命令行或者ResignTool客户端。

本文主要讲述sigh命令的安装和使用。

安装


首先确保你安装了Xcode的命令行工具。

xcode-select --install

然后通过gem安装sigh,gem的安装请自行谷歌。

sudo gem install sigh

如何使用


在终端执行

sigh resign

依次执行下列步骤:

  1. 显示Path to ipa file:-将重签ipa拖入回车;
  2. 显示Signing Identity:-填写正确的签名证书回车;
  3. 显示Path to provisioning file:-将签名所用的描述文件拖入回车;
  4. 最后等签名结果,成功后会替换原路径的ipa文件。

关于更多sigh用法请访问sigh使用

最后


签名成功的应用就可以顺利在我们的设备中安装了并使用了,用这个方法可以进行非越狱平台安装在正版基础移植的越狱应用。

!注意:如果是对iTunes正版应用进行签名在安装后运行时会闪退,需要先将应用进行破壳处理,因为苹果对应用进行了保护。

工具:https://github.com/InjoyDeng/ResignTool
借鉴:https://www.jianshu.com/p/d68924e1af25

https://www.jianshu.com/p/d68924e1af25
https://www.cnblogs.com/guohai-stronger/p/11781249.html

iOS APP签名机制详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容