Apple MDM 开发

MDM Vendor

MDM Vendor 指提供 MDM 服务的角色,比如 AirWatch 就是一个 MDM Vendor,要成为一个 MDM Vendor 需要有企业版开发者账号,然后去 apple 那里申请 mdm vendor 证书(有效期一年)。MDM Vendor 证书可以用来签名 MDM Customer 证书的 csr 文件。

MDM Customer

MDM Customer 指使用 MDM 进行设备管理的角色,比如某公司使用了 AirWatch 的 MDM 服务,那么它就是一个 MDM Customer。

MDM 涉及到的证书

  • MDM Vendor 证书,由我们自己去 apple 生成
  • MDM Customer 证书,由我们生成 csr,然后客户去 apple 那里生成并交给我们,用来和 APNS 通信给设备发送推送通知
  • SCEP 证书,用来签发设备身份证书的 CA 证书
  • 设备身份证书,由我们给设备的用来标识设备身份的证书

MDM 描述文件

设备通过安装一个描述文件来成为 MDM 受控设备,描述文件通常以 .mobileconfig 后缀,描述文件用来保存一组设备的配置策略,以便批量部署(如将 VPN 的配置写入描述文件,就可以通过给设备安装描述文件来批量快速的为设备配置 VPN),MDM 的配置也是写在描述文件的,可以通过 Apple Configurator 2 来生成描述文件,可以手动编写。
一个 MDM 描述文件最少需要包含两部分内容:

设备身份证书

当设备 enroll 成为一个受控设备的时候,会安装一个设备身份证书(Device Identify Certificate),这个设备身份证书用来标识设备,可以通过直接在 MDM mobileconfig 文件中嵌入 PKCS#12 来为设备产生证书,也可以通过 SCEP 协议来为设备颁发证书。一般建议使用 SCEP,PKCS#12 会在服务器端产生公私钥,而 SCEP 协议是由设备产生公私钥然后将公钥给服务器签名生成证书,安全性更强。

MDM payload

MDM payload 主要定义了和设备通信的 MDM server 的地址。

默认的描述文件是没有经过数字签名的,安装到设备上会显示未签名,可以通过添加数字签名来让其成为签名的描述文件(任意的证书私钥进行签名皆可)。

Supervisor Mode

普通的设备 enroll 成为 MDM 受控设备之后,MDM Server 下发一些控制指令,比如安装应用等,需要在设备上进行二次确认,我们可以把一台设备设置成被监督模式(Supervisor Mode),被监督的设备会静默执行安装应用等指令,可以通过 Apple Configurator 2 来将设备编程被监督设备。

!!! 成为被监督设备会清空设备所有内容,同时一些低版本 iOS,如 iOS8 会被要求强制升级到新版 iOS !!!
!!! 成为被监督设备会清空设备所有内容,同时一些低版本 iOS,如 iOS8 会被要求强制升级到新版 iOS !!!
!!! 成为被监督设备会清空设备所有内容,同时一些低版本 iOS,如 iOS8 会被要求强制升级到新版 iOS !!!

MDM 通信流程

MDM Server 和设备的通信主要通过三个URL:

  • scep: 给设备签发设备身份证书 (可选)
  • check in: 接收设备 enroll 鉴权,设备 token 更新,设备退出管理这三个事件
  • server: 接收设备状态、设备执行指令结果,下发指令给设备

MDM Server 通过 APNS 发送推送消息给设备,设备会请求 MDM Server 上报自己的状态,如 Idle 表示设备处于空闲状态。

<?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>Status</key>
    <string>Idle</string>
    <key>UDID</key>
    <string>【设备的udid】</string>
</dict>
</plist>

MDM Server 把需要设备执行的指令放在 response 里面下发给设备执行。

<?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>CommandUUID</key>
    <string>eba2a485-c5f7-4135-87e8-b36ea72a507d</string>
    <key>Command</key>
    <dict>
        <key>RequestType</key>
        <string>InstalledApplicationList</string>
    </dict>
</dict>
</plist>

设备完成指令执行后,会再次请求 MDM Server,将执行结果告诉我们,我们可以通过 CommandUUID 字段,来区分设备的这个请求对应的是哪一条指令的执行结果,同时我们可以把下一条需要设备执行的指令放到 response 里面去下发给设备。

<?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>CommandUUID</key>
        <string>eba2a485-c5f7-4135-87e8-b36ea72a507d</string>
        <key>InstalledApplicationList</key>
        <array/>
        <key>Status</key>
        <string>Acknowledged</string>
        <key>UDID</key>
        <string>【设备的udid】</string>
</dict>
</plist>

一些小 Tips

如何区分 check in 的设备是属于谁的

两个方法,

  1. 可以在 mobileconfig 文件的 check in url 等字段上加上 query 参数,如?accountId=1,然后就可以取出业务上无需要的用户信息了。
  2. check in 的时候,会带上 Topic 字段,可以将其和上传的 Push 证书的 Common 字段对比。
设备身份证书有什么作用

设备每次请求 MDM Server 都会带上设备身份证书,服务器可以开启 2-way SSL,来对请求的证书进行验证。

App 如何判断设备 enroll 的状态(是否受 MDM 管理,是否移除 MDM 管理)

可以通过给 App 推送配置的方式进行,通过 Configuration 这个命令,给设备的某个 App 推送一个配置,当设备处于 enrolled 状态的时候,此配置可读,当设备 checkout 后,此配置会被清除。

(完)

坚持原创技术分享,您的支持将鼓励我继续创作!