超级签名解决方案

超级签名又叫udid签名,是方面ios公开测试的一种解决方案,客户可以在ios app没有上架的情况下安装使用ios app,因为看上去很强大像超人一样,即所谓的超级签名

一、签名原理


签名原理简单点说使用了苹果提供给开发者的Ad-Hoc分发通道,把安装设备当做开发设备进行分发。

既然签名用是 Ad-Hoc ,那么 Ad-Hoc 所具有的优劣势也一并继承了下来:

优势:

1、直接分发,安装即可运行,不需要用户做企业证书的信任操作

2、目前稳定,不会有证书吊销导致的业务风险(后续苹果政策风险非常高)

缺点:

1、单开发者账号的iPhone设备数量只有100个,导致分发成本非常高(99美元/1年/100个设备)

2、开发者账号需要预先写入安装设备的UDID,在工具链不通的情况下,获取用户的UDID相对困难和繁琐,而且手动写入UDID不存在商用可行性,当然目前这个缺点被解决了

二、整体架构


1.设备安装描述文件后,会向服务器发送设备的UDID。

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

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

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

三、技术细节


使用配置文件获取UDID

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

  1. 在你的Web服务器上创建一个.mobileconfig的XML格式的描述文件;

  2. 用户在所有操作之前必须通过某个点击操作完成.mobileconfig描述文件的安装;

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

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

  5. mobileconifg写法

     <!--参考:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/iPhoneOTAConfiguration/ConfigurationProfileExamples/ConfigurationProfileExamples.html-->
     <?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>PayloadContent</key>
             <dict>
                 <key>URL</key>
                 <string>http://s.kxapp.com/udid/receive.php</string> <!--接收数据的接口地址-->
                 <key>DeviceAttributes</key>
                 <array>
                     <string>UDID</string>
                     <string>IMEI</string>
                     <string>ICCID</string>
                     <string>VERSION</string>
                     <string>PRODUCT</string>
                 </array>
             </dict>
             <key>PayloadOrganization</key>
             <string>dev.skyfox.org</string>  <!--组织名称-->
             <key>PayloadDisplayName</key>
             <string>查询设备UDID</string>  <!--安装时显示的标题-->
             <key>PayloadVersion</key>
             <integer>1</integer>
             <key>PayloadUUID</key>
             <string>3C4DC7D2-E475-3375-489C-0BB8D737A653</string>  <!--自己随机填写的唯一字符串-->
             <key>PayloadIdentifier</key>
             <string>dev.skyfox.profile-service</string>
             <key>PayloadDescription</key>
             <string>本文件仅用来获取设备ID</string>   <!--描述-->
             <key>PayloadType</key>
             <string>Profile Service</string>
         </dict>
     </plist>

签名封包工具

获得udid后可以使用 开心签名工具- 命令行工具 进行ipa的签名 http://s.kxapp.com/index.php

普通签名例子

./ausign_linux -sign 2.ipa -c my.p12 -m my.mobileprovision -p 123 -o resign-abc.ipa

说明:签名都是以 -sign 参数开始 ,后面是被签名的ipa文件,-c 指定证书,-m 指定描述文件 ,-p 指定证书密码 -o 指定签名完后文件的存放地址

组合签名例子

./ausign_linux -sign 2.ipa -c my.p12 -m my.mobileprovision -p “123” -o resign-555.ipa -id “com.tencent.wechat3” -n “微信马甲3” -v “1.0.0” -dt -at 20190902

上面各种参数可以组合使用,上面是一个例子,自动删除时间锁,自动插入时间锁设置到期日期20190902,然后把id修改为自己的com.tencent.wechat3,把名字修改为微信马甲3,把版本号改成1.0.0

写签名脚本,调用命令行工具即可把开心签名集成在系统中,实现自动化签名,同时可以通过开心签名对已签名的应用进行管理,享有加时间锁、动态启用禁用等应用管理功能

php签名脚本示例:

<?php
//$signRoot="/var/www/test/";//linux
$signRoot="D:/test/";//win
//$signPath=$signRoot."tool/ausign";//linux
$signPath=$signRoot."tool/ausign.exe";
$certPath=$signRoot."dev.p12";
$mobileProvisionPath=$signRoot."dev.mobileprovision";
$ipaPath=$signRoot."ipa/game.ipa";
$saveIpaPath=$signRoot."resigned/game.ipa";
$certPassword="123456";
$loginCmd=$signPath.' -email 2462611616@qq.com -p 123456';
$signCmd=$signPath.' -sign '.$ipaPath." -c ".$certPath." -m ".$mobileProvisionPath." -p ".$certPassword." -o ".$saveIpaPath;
$addTimeSignCmd=$signCmd." -at 20190901";//签名并插入锁的命令

exec($loginCmd,$outputString,$loginStatus);
if($loginStatus!=0){
echo "login fail <br/>";
echo var_dump($outputString);
}else{
echo "login success <br/>";
exec($signCmd,$outputString,$signStatus);
if($signStatus!=0){
echo "sign fail <br/>";
echo var_dump($outputString);
}else{
echo "sign success,ipa saved to ".$saveIpaPath;
}
}
//输出
//login success
//sign success,ipa saved to D:/test/resigned/game.ipa

分发应用

得到重签名后应用,即可进行分发,提供给用户下载安装


整个流程下来,就完成了使用超级签名并分发!!