IOS超级签名原理及实现

        随着App审核越来越严格,面临上架困难无法上架问题日益突出,现有上架方式只能选择选择企业签,超级签,TF签这几种,企业签掉签严重,TF签需要安装testflight并且还有内测时间限制,超级签成本高签名相对稳定,下面说下超级签原理和实现。

超级签名原理

        使用苹果提供给开发者的Ad-Hoc分发通道,把安装设备当做开发设备进行分发,要做到自动化首先需要获取用户设备的UDID,获取UDID后需要将UDID添加到苹果开发者中心进行生成描述文件,根据生成的描述文件、证书文件、待签名包进行重新签名生成安装包ipa。

整体流程


设备安装描述文件后,设备会向服务器(描述文件内回调服务器地址)发送设备的UDID。

服务器收到UDID后,将UDID注册到某个苹果开发者账号下。

再生成签名用的描述文件,给IPA签名。

然后iPA传Server,使用itms-services方式让用户下载。

技术细节

UDID的获取:

苹果公司允许开发者通过IOS设备和Web服务器之间的某个操作,来获得IOS设备的UDID(包括其他的一些参数)。

在你的Web服务器(可以是任意语言的web服务)上创建一个.mobileconfig的XML格式的描述文件;

用户下载描述文件后需要再手机设置里操作完成.mobileconfig描述文件的安装;

服务器需要的数据:UDID,需要在.mobileconfig描述文件中配置好,以及服务器接收数据的URL地址;

当用户设备安装描述文件后,设备会回调你设置的URL,如果你的URL返回302跳转的话,Safari浏览器会跳转到.mobileconfig文件中的回调地址;

XML代码如下:

   

        PayloadContent

       

            URL

            一个接收UDID的网址

            DeviceAttributes

           

                UDID

                IMEI

                ICCID

                VERSION

                PRODUCT

           

       

        PayloadOrganization

        GuangdongQi

        PayloadDisplayName

        AppFree

        PayloadVersion

        1

        PayloadUUID

        9CF421B3-9853-4454-BC8A-982CBD3C907C

        PayloadIdentifier

        com.gpon.profile-service

        PayloadDescription

        This temporary profile will be used to find and display your current device's UDID.

        PayloadType

        Profile Service

   

开发者设备注册 更新Provisioning Profile:

        注册设备前提是需要登陆苹果开发者中心才能有权限注册设备,现有文章资料是通过(AppleDeveloperCenter自动化工具)调用Api实现注册更新,这个工具我没有去研究,应该是个很不错的工具。下面介绍下直接通过调用苹果开发者网站接口来实现登陆注册和更新描述文件,直接调用苹果接口的速度基本是秒生成,和AppleDeveloperCenter工具理论是一个方式都是调用Api接口所以在速度方面是相同的。

        登陆苹果开发者网站登陆需要很多请求头参数,最主要的就是“X-Apple-I-FD-Client-Info” 参数,X-Apple-I-FD-Client-Info请求头算法决定着通过苹果的验证,这里大致说下算法参数,这个算法通过获取浏览器的类型navigator.browser,浏览器版本navigator.Version,浏览器语言navigator.browserLanguage,插件Plugin,地域area,时间timestamp,screen.deviceXDPI,screen.deviceYDPI等多个参运算才能生成一个动态验证串 json 如下

{"U":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36","L":"zh-CN","Z":"GMT+08:00","V":"1.1","F":"cOa44j1e3NlY5BSo9z4ofjb75PaK4Vpjt.gEngMQEjZr_WhXTA2s.XTVV26y8GGEDd5ihORoVyFGh8cmvSuCKzIlnY6xljQlpRD__htduVCbqWxf7_OLgiPFMJhHFW_jftckkCoqAkCoq0NUuAuyPB94UXuGlfUm0NUbNiqUU8jA2Q3wL6k03x0.5EwHXXTSHCSPmtd0wVYPIG_qvoPfybYb5EvYTrYesSAAQnIp.QEh2vLG9mhORoVijvw2WwjftckvIhIDLTK43xbJlpMpwoNSUC56MnGWpwoNHHACVZXnN9PL3rO8V.ueururJhBR.uMukAm4.f282pvEodUW2RjOI0NTg7lrCU.6elV2pNJFv64WDvUL0TFl9kmFxH_UavEp.icCmx_B4W1kl1BNlY6SGWY5BOgkLT0XxU..3hs"}

1.得到X-Apple-I-FD-Client-Info验证数据就可以登陆苹果开发者中心了,拿到授权Cookie可以操作开发者中心任意接口。

2.获取苹果团队TeamId,这在以后的注册设备,新建描述文件接口当中都会用到,具体的登陆地址以你可以使用Fildder进行抓包查看。

3.调用注册设备接口 “/services-account/QH65B2/account/device/addDevices.action” 提交设备UDID,teamid,devicePlatforms,deviceNames,deviceNumbers,register 参数进行注册。

4.创建描述文件 /services-account/QH65B2/account/ios/profile/createProvisioningProfile.action 我们通过这个接口来创建一个新的描述文件

IPA重新签名

事实上ipa文件只是一个zip包,可以使用如下命令解压:

/usr/bin/unzip -q xxx.ipa -d

解压后,得到上图的Payload目录,下面是个子目录,其中的内容如下:

资源文件,例如图片、html、等等。

_CodeSignature/CodeResources。这是一个plist文件,可用文本查看,其中的内容就是是程序包中(不包括Frameworks)所有文件的签名。注意这里是所有文件。意味着你的程序一旦签名,就不能更改其中任何的东西,包括资源文件和可执行文件本身。iOS系统会检查这些签名。

可执行文件。此文件跟资源文件一样需要签名。

一个mobileprovision文件.打包的时候使用的,从MC上生成的。

Frameworks。程序引用的非系统自带的Frameworks,每个Frameworks其实就是一个app,其中的结构应该和app差不多,也包含签名信息CodeResources文件

重新签名条件需要获取对应文件:

UDID描述文件(上面我们已经拿到了)

苹果开发者账号Cer证书(这个可以从开发者账号下载,前提是你生成了这个证书)将这个证书通过openssl转换为p12证书(证书和密码)

有了上面两个文件后开始签名,签名利用到的工具大多数都是mac,linux平台的 mac平台成本高,这也就是为什么现在的签名大多数都是linux平台,以下大概介绍window平台下进行重签名。

IPA重新签名原理本质是利用苹果根证书进行校验开发者证书及利用证书加密,先要获取到苹果根证书 X509Certificate,再获取开发者账号证书

X509Certificate校验证书和密码,加载待签名IPA包利用证书给每一个文件进行重新签名。

重新签名后得IPA包使用itms-services方式下载,就可以安装到指定的UDID设备手机上了。


参考资料

UDID的获取

通过Safari浏览器获取iOS设备UDID(设备唯一标识符)-天狐博客

为iOS的mobileconfig文件进行签名-天狐博客

IOS签名机制

iOS程序的证书和签名机制 - SegmentFault

体验地址:http://dev.airsign.top/

有需要帮组的和代码需求的可以联系我


你可能感兴趣的:(IOS超级签名原理及实现)