iOS证书及ipa包重签名探究

By | 2015年4月12日

转载请注明出处:http://www.olinone.com/ 

        iOS证书学习推荐博客代码签名探析,本文重点在于介绍ios8.1.3系统ipa包重签名(如企业证书)无法安装的问题。苹果在iOS8.1.3系统以后加强了对ipa安装包签名的验证,主要区别在于ipa唯一标识在原有Bundle Identifier的基础上增加了证书ID,也就说安装包和手机上已安装APP的Bundle Identifier即使一致,如果两者签名的证书ID不相同,那么安装包也无法正常安装。证书ID是什么?

图中方框里字符串就是证书ID,升级后的ipa标识就是证书ID+BundleID,只有两者完全匹配,安装包才能覆盖安装,否则就会提示安装失败。解决办法就是卸载安装包,重新安装!

目前,重签名主要用于企业证书重签名个人证书发布的ipa包,包括各种助手及企业内测包的发布等。在重签名前,让我们先看看一个完整的ipa包有哪些与证书相关的东西!打开ipa包,会发现_CodeSignature和embedded.mobileprovision两个文件

  • _CodeSignature,ipa包签名文件
  • embedded.mobileprovision,证书配置文件

因此,替换上面两个文件就解决了ipa重签名的主要问题。此外,代码签名探析文中还提到entitlements.plist授权文件,重签名时也需要处理。按照下图内容创建plist文件,输入相关信息。

 

整个签名过程如下(文件路径自定义)

1、解压ipa安装包

2、替换证书配置文件(文件名必须为embedded,不得自定义)

3、重签名(certifierName为重签名证书文件名,可以加证书ID后缀)

4、打包

很多朋友在重签名时会忽略第二步或者没有指定entitlements.plist,都会造成ipa包安装失败。如果有其它关于签名的问题,可以在文章下面跟我留言!

喜欢请点赞->https://github.com/panghaijiao,谢谢你的来访!

 

9月22号更新,有朋友反馈9.0无法打开的问题,可以访问iOS9适配教程

6月22号更新,详情教程地址


 

12月21日,自从本文发布后,收到了很多朋友的反馈,感谢大家。很多朋友也提出了遇到的各种问题,再次需要补充两点

有些朋友希望修改bundle ID重签名,据有些朋友说是可以的,不过我目前还不知道怎么做,有知道的朋友可以告诉我,替各位谢谢了

其次,有些朋友希望修改ipa包里的素材,然后再签名,以我所知,这个貌似也行不通

 

154 thoughts on “iOS证书及ipa包重签名探究

  1. Pingback: WWDC 2015 将于 6 月 8 日在旧金山开幕 – iOS 移动开发周报 – 剑客|关注科技互联网

  2. Pingback: iOS移动开发周报-第43期 – 剑客|关注科技互联网

      1. 子非鱼

        输入codesign -f -s $certifierName –entitlements entitlements.plist的路径 提示cannot read entitlement data

        Reply
  3. Pingback: iOS移动开发周报-第43期

  4. Pingback: iOS移动开发周报-第43期 | 微时代

  5. 冷锋

    如果修改里面的图片资源,然后重新签名,能安装成功,但是闪退,如何解决

    Reply
      1. 冷锋

        您好,已经解决了,不知道什么原因,第二次重新打包就不闪退了,这边两台测试设备都是,第一次打包的一直闪退,重新打包后正常

        Reply
        1. ash

          你好,从App Store上下载的app,重签名后可以安装,但是打开闪退的问题,你解决了木有?我这边也是同样的问题。。

          Reply
        2. Eight

          您说的二次打包是怎样的、我也试图去修改资源后重签、但是装的途中日志显示增加了好多 ._*(*是修改后的资源文件名称) ,能安装\就是闪退~ 您说的二次打包是怎样的?

          Reply
        1. 匿名

          你好,我想替换ipad包中的一个plist文件,该怎么做呢??

          Reply
      2. 冷锋

        另外,像QQ这种,打包之后能成功安装,但打开就闪退,如何解决呢

        Reply
        1. 冷锋

          刚测试的,上架到AppStore的app在7.1.2iPad 7.1.2iPhone4 8.1.2iPhone6 8.13iPhone6P 均可安装,但打开闪退。。。。必须最开始就是用企业证书打包的ipa ,重新签名后才可用

          Reply
          1. 庞海礁 Post author

            appstore的ipa包是经过加密的,重签名应该是不行的!没有试过,不是很清楚,有时间可以研究下。不过只要不是appstore的包,即使是开发签名的包也是可以用企业证书重签名的!

  6. 不曾拥有

    有一个问题想请教一下
    博主上面说 app 签名 主要与这两个文件有关
    _CodeSignature,ipa包签名文件
    embedded.mobileprovision,证书配置文件

    我自己测试的时候 一直没有用 entitlements.plist 这个文件
    我首先把 app 包里面的 _CodeSignature 备份一下, 然后删除
    接着调用 codesign -f -s ‘xxxxxxx’ xxx.app 直接签名
    然后这时候得到的app 打包 安装失败
    将重签之后的app 中的_CodeSignature 取出 与原来的 用 文本文件进行对比 发现是一样啊 但是却无法安装

    如果用博主的方式 添加一个 entitlements.plist 就能成功安装

    Reply
    1. 庞海礁 Post author

      是的,在重签名时必须指定entitlement.plist文件,因为打包后的签名证书和打包之前的签名证书是不同,如果不指定新的entitlement,那么就会出现两者不同无法安装的问题!

      Reply
      1. 不曾拥有

        感谢博主解答
        刚才又去看了一下 xcodebuild 的log 发现 其也是调用了一个 entitlements 文件

        Reply
    2. 庞海礁 Post author

      CodeSignature文件在codesign时系统会为我们重新生成的,所以不需额外处理!

      Reply
      1. 不曾拥有

        是的 codesign 是会自动创建CodeSignature 文件
        我之前只是疑惑, 为什么原始app 能安装
        codesign -f -s ‘xxx’ 不加 entitlement.plist 签名之后的app 就不能安装
        于是 就把原始CodeSignature 与 签名之后的 CodeSignature 拿出来对比 发现是一样的

        Reply
  7. applled

    如果是企业证书,创建in house类型的pp文件的时候,现在貌似不能选择带通配符的app ID了。除了每个应用都建一个Explicit app ID,博主有没有其他方法呢?

    Reply
    1. 庞海礁 Post author

      现在苹果对证书签名管理比较严格,目前通配符好像是不行了,很遗憾,我也不知道如何解决通配符的问题!

      Reply
  8. victor3345

    在签名的时候遇到
    iPhone: ambiguous (matches “