风涩 發表於 2019-10-23 15:52:00

iOS开发 - 超级签名实现之描述文件

<h2 id="简介">简介</h2>
<p>因为最近企业签掉得太严重了,上头要求实现超级签进行游戏下载。故有了此文章,记录一下过程。</p>
<p>签名原理其实很简单,超级签名的技术就是使用个人开发者账号,将用户的设备当作开发设备进行应用分发。这也导致成本非常高,一个开发者账号最多只能注册一百台设备,然而一个账号的价格为99美元。不过目前超级签分发的应用稳定性很高,不用再像企业签那样经常掉签。</p>
<h2 id="新建-mobileconfig-描述文件">新建 .mobileconfig 描述文件</h2>
<p>该描述文件用于获取用户设备的UDID,用户通过某个点击操作下载此文件,安装后服务器会收到该用户设备的 UDID 回调事件。</p>
<pre><code class="language-xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
    &lt;dict&gt;
      &lt;key&gt;PayloadContent&lt;/key&gt;
      &lt;dict&gt;
            &lt;key&gt;URL&lt;/key&gt;
            &lt;string&gt;https://[你的服务器地址].com/resource/uploadUUID.do&lt;/string&gt; &lt;!--接收数据的接口地址--&gt;
            &lt;key&gt;DeviceAttributes&lt;/key&gt;
            &lt;array&gt;
                &lt;string&gt;UDID&lt;/string&gt;
                &lt;string&gt;IMEI&lt;/string&gt;
                &lt;string&gt;ICCID&lt;/string&gt;
                &lt;string&gt;VERSION&lt;/string&gt;
                &lt;string&gt;PRODUCT&lt;/string&gt;
            &lt;/array&gt;
      &lt;/dict&gt;
      &lt;key&gt;PayloadOrganization&lt;/key&gt;
      &lt;string&gt;xxx.xxx.com&lt;/string&gt;&lt;!--组织名称--&gt;
      &lt;key&gt;PayloadDisplayName&lt;/key&gt;
      &lt;string&gt;查询设备UDID&lt;/string&gt;&lt;!--安装时显示的标题--&gt;
      &lt;key&gt;PayloadVersion&lt;/key&gt;
      &lt;integer&gt;1&lt;/integer&gt;
      &lt;key&gt;PayloadUUID&lt;/key&gt;
      &lt;string&gt;c156f2f8-fc42-4260-8fc5-8644861d8293&lt;/string&gt;&lt;!--自己随机填写的唯一字符串,http://www.guidgen.com/ 可以生成--&gt;
      &lt;key&gt;PayloadIdentifier&lt;/key&gt;
      &lt;string&gt;xxx.xxx.profile-service&lt;/string&gt;
      &lt;key&gt;PayloadDescription&lt;/key&gt;
      &lt;string&gt;本文件仅用来获取设备ID&lt;/string&gt;   &lt;!--描述--&gt;
      &lt;key&gt;PayloadType&lt;/key&gt;
      &lt;string&gt;Profile Service&lt;/string&gt;
    &lt;/dict&gt;
&lt;/plist&gt;
</code></pre>
<h2 id="注册开发者设备及签名包体">注册开发者设备及签名包体</h2>
<p>由于时间太赶,这里注册开发者设备及签名包体采用的都是三方提供的服务,因此没有细节提供,但是怎样去做还是可以说一下的。</p>
<p>我们可以借助<code>Spaceship</code>工具完成注册新的开发者设备和更新<code>Provisioning Profile</code>,签名包体可以用<code>Sigh</code>框架,具体实现请自行搜索。</p>
<p>最后用户下载的方式与企业签的一样,使用<code>itms-services</code>协议进行下载。</p>
<h2 id="ssl-签名-mobileconfig-配置文件">ssl 签名 .mobileconfig 配置文件</h2>
<p>我看了很多文章,都是用开发者证书去签名的,可是我弄了好久,死活从“未签名”变成了“”尚未验证“,当时一度绝望了好长时间。从 iPhone 配置实用工具 2.2 到 iPhone 配置实用工具 3.5,皆不成功。</p>
<p>配置文件是可以使用的,虽然说安装时会提示红色字“尚未验证”,看起来不太安全之外,一切安好。可是要有追求啊,别人能做到的东西,那就是肯定能做的。</p>
<p>ssl 证书签名配置文件是知道的,可是向后端人员要证书文件的时候一度受到了困扰,所以前期搁置了好久,直到其它的方法都被我试过了,都不行之后,只好继续调研 ssl 证书签名配置文件。</p>
<p>踩完无数的坑之后,这里介绍一种亲测可用的方法,使用 ssl 证书进行配置文件的签名。我是看这篇文章实现的为iOS的mobileconfig配置文件进行签名。</p>
<p>很简单,需要三个文件,三行命令,完成。</p>
<pre><code class="language-sh">$ openssl smime -sign -in unsigned.mobileconfig -out signed.mobileconfig -signer mbaike.crt -inkey mbaike.key -certfile ca-bundle.pem -outform der -nodetach
$ openssl rsa -in mbaike.key -out mbaikenopass.key
$ openssl smime -sign -in unsigned.mobileconfig -out signed.mobileconfig -signer mbaike.crt -inkey mbaikenopass.key -certfile ca-bundle.pem -outform der -nodetach
</code></pre>
<blockquote>
<p>这里耗时主要是在等运维人员提供相关证书文件,千万别给错了,否则很难 Debug。</p>
</blockquote>
<h2 id="下载描述文件后不能自动跳转到安装界面">下载描述文件后不能自动跳转到安装界面</h2>
<p>在 iOS 12.2 上苹果做了改动,下载完后需要用户手动进行安装。点击 设置 —— 已下载描述文件,会自动弹出描述文件安装界面,点击右上角安装即可。</p>
<p>官方说明点这儿在 iPhone 或 iPad 上安装配置描述文件。</p>
<h2 id="利用-mobileprovision-跳转到已下载描述文件">利用 .mobileprovision 跳转到已下载描述文件</h2>
<p>这是为了方便用户不需手动找描述文件并安装,可以直接跳过去,省去用户操作。</p>
<ol>
<li>
<p>从苹果开发者网站中下载对应的发布描述文件;</p>
</li>
<li>
<p>把发布描述文件部署在服务器;</p>
</li>
<li>
<p>web 访问服务器的发布描述文件,如: <code>http://***.com/embedded.mobileprovision</code>;</p>
</li>
<li>
<p>Done。</p>
</li>
</ol>
<p>当执行第三步后,会自动跳转至描述文件。</p>
<h2 id="参考文献">参考文献</h2>
<p>Create GUIDs online</p>
<p>SSL Converter - Convert SSL Certificates to different formats</p>
<p>mobileconfig文件的签名和认证(signed、verified)</p>
<p>iOS超级签名</p>
<p>通过Safari浏览器获取iOS设备UDID(设备唯一标识符)</p>
<h2 id="声明">声明</h2>
<p>博文作者:GarveyCalvin<br>
博文出处:http://www.cnblogs.com/GarveyCalvin/<br>
本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!</p>


</div>
<div id="MySignature" role="contentinfo">
    活着,就是为了改变世界!<br><br>
来源:https://www.cnblogs.com/GarveyCalvin/p/ios-super-sign.html
頁: [1]
查看完整版本: iOS开发 - 超级签名实现之描述文件