iOS之IPA重签(ReSign)

假如我有一个IPA,我想要换掉其证书的话。老办法是使用Xcode,使用新的证书进行打包,重新生成IPA文件。

最近偶得灵感,觉得苹果会留给我们手签IPA的方法,于是,网上找了下,并结合苹果的文档,成功修改了多个IPA的签名证书,并使用Application Loader 成功上传。下面,简单说下重签命令。

首先我们要准备三个文件,一个是IPA文件,一个是mobileprovision文件,还有一个是知道了密码的含有私钥的p12文件。我们先把p12文件打开,输入密码,装载到钥匙串里面。准备工作搞定后,可以开始我们的重签之路。

第一步,解压缩你的ipa文件,使用如下命令:

$ unzip xxx.ipa
//执行完后会多出一个Payload文件夹
//后续相关操作,均操作这个文件夹
//操作完成后,会压缩该文件夹,生成IPA文件

第二步,进行Info.plist中相关包名,版本号等信息的修改,命令如下:

$ /usr/libexec/PlistBuddy Payload/xxx.app/Info.plist (备注:敲完此命令后,再分别敲如下的每个命令)
Set :CFBundleIdentifier com.resign.test
Set :CFBundleShortVersionString 1.0.0
Set :CFBundleVersion 1
save
quit

其中 CFBundleIdentifierCFBundleShortVersionString等值可参考官方链接Information Property List Key Reference

第三步,复制mobileprovision文件到Payload文件夹中,命令如下:

$ cp xxx.mobileprovision Payload/xxx.app/embedded.mobileprovision
//这里embedded.mobileprovision名称是固定的

第四步,加密Frameworks中的文件,如果你的代码中使用的是 .a库的话,此步可以忽略,因为只会生成一个可执行文件,会在第五步中进行重签。此外,如果你使用的是动态库,并且选择了static,这里不是Frameworks,而是一个Embedded(类似此名字,具体未查看)。重签此部分的代码如下:

#!/bin/sh

#  resign-framework
#  
#
while getopts "i:" arg #选项后面的冒号表示该选项需要参数
do
        case $arg in
            i)
                identifier=${OPTARG}
                ;;
            ?)  #当有不认识的选项的时候arg为?
        # exit 1
        esac
done
#检查参数
if [[ x${identifier} == x ]]; then
    echo "请输入证书名称,如\"iPhone Distribution......SRF3)\""
    exit
fi

appFolder=""

# search app floder
for app_item in ./Payload/*.app
do
    if test -d $app_item
    then
        appFolder=$app_item
    fi
done

if [ ${appFolder}x != "x" ]; then
    echo "did found app:"$appFolder
else
    echo "no ipa found."
    rm -rf resign.log
    exit
fi

for bundle_item in ${appFolder}/Frameworks/*.framework
do
    if test -d $bundle_item
    then
        fileName=`basename ${bundle_item}`
        fileName=${fileName%%.*}
        `codesign -f -s "${identifier}" ${bundle_item}/${fileName}`
    fi
done

此处的代码块可以放在一个文件中,这里我使用名为resign-framework文件保存此代码,然后在包含Payload文件夹的目录中,调用此命令:

$ chmod 777 resign-framework
$ ./resign-framework -i "${identifier}"
//${identifier}的值改为你证书在钥匙串(Keychain Access)中的identifier,
//在钥匙串中选中你的证书,顶部以类似`iPhone Distribution:`开头的一行字符串即为"identifier"
//备注:命令中记得要带双引号

第五步,重签项目可执行文件,这里首先需要准备xxx. mobileprovision文件的Entitlements.plist文件,方法如下命令:

$ security cms -D -i "xxx.mobileprovision"
//使用该命令进行查看xxx.mobileprovision文件的相关内容,可以找到以Entitlements为key的字典值。
//新建一个.plist文件,将上述值复制到plist文件中。如下示例:
<?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>keychain-access-groups</key>
    <array>
        <string>AD9JDJKJKA.*</string>
    </array>
    <key>get-task-allow</key>
    <false/>
    <key>application-identifier</key>
    <string>AD9JDJKJKA.com.resign.test</string>
    <key>com.apple.developer.team-identifier</key>
    <string>AD9JDJKJKA</string>
    <key>aps-environment</key>
    <string>production</string>
    <key>beta-reports-active</key>
    <true/>
</dict>
</plist>

再生成Entitlements.plist文件后,即可进行重签:

$ codesign --entitlements Entitlements.plist -f -s "${identifier}" Payload/${appName}.app/${appName}
//${appName}用具体的名称代替,可执行文件名也为${appName}
//${identifier}仍为上方获取到的证书"identifier",注意加双引号

第六步,也是最后一步,压缩文件夹,生成新的IPA:

$ zip -qr app-resigned.ipa Payload/

至此,我们可以得到一个新的app-resigned.ipa文件,可上传测试。

阅读此文章时,如有任何问题,可邮件至wshfor@hotmail.com,如有IPA重签失败,请邮件附带IPA、P12文件、P12密码、mobileprovision文件。

欢迎讨论,留言。

Inside Code Signing

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

推荐阅读更多精彩内容

  • ipa 包重签名最新最简单教程 重签名的意义:ipa 重签名最大的用处是,不必重新打包,和配置其它第三方获取 ap...
    红发_KVO阅读 72,498评论 24 63
  • 准备工作 代码签名 (code signing) 对一个App来讲至关重要,是iOS系统安全的重要组成部分,决定了...
    pandora的技术博客阅读 2,800评论 3 51
  • 一.理解iOS签名机制 网上有很多资料,这里不展开细说,重点参考这三篇文章: https://www.objccn...
    huig游影阅读 1,044评论 0 1
  • 这两天终于彻底搞定了ipa签名的问题,整理一下作为总结 打包流程 超好用的resign脚本 之前搜索了一个很简单的...
    tom510230阅读 3,529评论 9 5
  • 接触iOS开发多年,花了一点时间去研究了一下iOS这套证书和签名机制,并撰文分享给需要的朋友。由于本人才疏学浅,多...
    风和花阅读 1,855评论 0 7