现在大部分超级签名原理及实现都是基于linux平台来实现签名的,代码都是java,php的需要各种部署,各种调用第三方工具,具体实现起来还是有些麻烦的,以下介绍超级签名完全基于Windows平台来实现,方便部署,给不懂php和linux提供个思路。
超级签名原理
签名原理其实就是,使用了苹果提供给开发者的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文件中的回调地址;
开发者设备注册 更新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的组成
事实上,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的获取及签名
http://www.skyfox.org/safari-ios-device-udid.html
http://www.skyfox.org/ios-mobileconfig-sign.html
IOS签名机制
https://segmentfault.com/a/1190000004144556
现已经全部实现超级签名的自动化签名和下载,目前这套Windows平台超级签名已稳定运行。有需求的可以联系我 QQ2111059699。
网友评论