Apple MDM 開發

jianggaocheng發表於2019-01-25

本文首發於我的個人部落格 www.cc-lab.cn/apple-mdm-d…

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 後,此配置會被清除。

相關文章