创建一个简单的 MDM server(1)
前提:已獲得 APNS 證書 ,已完畢 MDM 配置描寫敘述文件的制作。請參考《 MDM 證書申請流程 》一文和《配置MDM Provisioning Profile》。
環境:OSX 10.9.2,JDK 1.6。Eclipse JavaEE Helois,Tomcat 7.0
一、前言
《THE IOS MDMPROTOCOL》(即Inside Apple MDM)一文中描寫敘述了一個簡單 MDM Server Python 實現(server.py)。
筆者也曾參照此文配置,但在安裝M2Crypto 一步時遇到一個 cc 參數沒有定義錯誤。實在無法進行下去,因此不得不放棄。在參照《基于IOS上MDM技術相關資料整理及匯總》一文時,發現其使用了商業SSL證書(StartSSL)。而筆者使用的自簽名SSL證書,有些步驟不太一樣 ,另外在一些關鍵點也須要讀者自己摸索,因此有了本文的誕生。
二、準備
無論 APNS 還是 MDM,都須要server實現 https。如果我們使用 Eclipse 調試 Tomcat,則須要改動 Servers 項目以下的Tomcat 配置文件 server.xml。詳細過程請參考《開啟 Tomcat https 服務》。
三、 實現 checkin URL
MDM 須要實現完整 APNS 服務,對此我們採用的是第三方的 java apns 實現。
主要是 notnoop 的 Java apns(不是google 的 JavaPNS),此外,還有 xmlwise ,用于解析蘋果的 plist 文檔。
java apns有兩個包:apns-0.1.5.jar 和 apns-0.1.5-jar-with-dependencies.jar包。
前者是 API,后者是依賴包。
xmlwise 就一個包:xmlwise-1_2.jar。
數據庫採用 mysql。因此也須要 mysql-connector-java-5.1.2-bin.jar包。
此外java apns 使用了slf4j。即 slf4j-simple-1.7.7.jar。
將 MDM push 證書 mdm_push.p12 和 provisioning 配置描寫敘述文件 client.mobileconfig 放到WebContent 文件夾下。
用 MySQLWorkbench 連上 mysql 數據庫,創建兩張表。用于設備注冊:
CREATE TABLE `Authenticate` (
? `UDID` varchar(40) NOT NULL,
? `Topic` varchar(200) DEFAULTNULL,
? `timestamp` timestamp NULLDEFAULT CURRENT_TIMESTAMP,
? PRIMARY KEY (`UDID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
?
?
CREATE TABLE `TokenUpdate` (
? `UDID` varchar(40) NOT NULL,
? `Topic` varchar(200) DEFAULTNULL,
? `PushMagic` varchar(200)DEFAULT NULL,
? `Token` varchar(200) DEFAULTNULL,
? `UnlockToken` blob,
? `timestamp` timestamp NULLDEFAULT CURRENT_TIMESTAMP,
? PRIMARY KEY (`UDID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
首先看注冊服務。設備注冊由Servlet checkin 實現。其 doPut 方法例如以下:
System.out.println("*********ReceivedMessage:***********\n"+plistStr);
try{
Map<String,Object>plist=Plist.fromXml(plistStr);
if(plist!=null){
StringMessageType=plist.get("MessageType").toString();
if(MessageType.equals("Authenticate")){
Authenticate au=newAuthenticate(plist.get("UDID").toString(),plist.get("Topic").toString());
au.save();
}elseif(MessageType.equals("TokenUpdate")){
Stringregex="Token</key>\\s*<data>\\s*([^\\s]*)\\s*</data>";
String tokenStr=Utils.regxCatch(plistStr,regex);
System.out.println("catches tokens:"+tokenStr);
TokenUpdate tu=new TokenUpdate(plist);
tu.Token=tokenStr;
tu.save();
}
response.getWriter().println(Utils.emptyPlist());
}
}catch(Exceptione){
e.printStackTrace();
}
checkin 主要處理與注冊相關的兩種消息:Authenticate 和 TokenUpdate。
在設備注冊中,server首先收到Authenticate 消息,checkin 將之計入 Authenticate 表,然后返回一個空的 plist 文件。設備隨后會發來TokenUpdate 消息。checkin 也會將之存到 TokenUpdate 表并返回空 plist 文件。在 TokenUpdate 消息的處理中,checkin獲取的是 UDID、device token、push magic和 unlock 等 MDM push中將要用到的重要字段。
當中,token(即 APNS 中的 device token)須要特別注意。
由于在蘋果的文檔中說,這是一個32位長度的字符串。
實際上我們都知道APNS 中,device token 是一個 byte 數組。
在 TokenUpdate 消息中,iOS 將 device token 的 byte 數組進行了base64 編碼,結果變成了一個 44 字節長度的 string。也就是說在 TokenUpdate 消息中。<token>字段的值類型應該是<string>,而不應該是消息中定義的<data>。
一個典型的 TokenUpdate 消息,其 token 描寫敘述例如以下:
<key>Token</key>
<data> [ 32 byte string, base64 encoded,redacted ]</data>
顯然,這里的<data>必須換成<string>。xmlwise 包中的 Plist 類才干正確解析。
由于在 Plist 類中,對于 plist 文件里的數據類型<data>會被解析為 byte 數組而不是字符串。
因此 checkin 在處理 TokenUpdate 消息時。採取了額外的手段來獲取 token 字段,即正則捕獲。
執行 Tomcat server,將 iPad 接入server統一 wifi 網絡,然后在瀏覽器中訪問描寫敘述文件地址:
https://192.168.2.1:8443/mdmtest/client.mobileconfig
此時 safari 將調用設置程序,在客戶端安裝 mdm 配置描寫敘述文件。當你點擊“安裝”button,iPad 會請求 checkin URL地址,并發送Authenticate 消息和 TokenUpdate 消息。你能夠在數據庫中查看到這兩條消息。
轉載于:https://www.cnblogs.com/liguangsunls/p/6701342.html
總結
以上是生活随笔為你收集整理的创建一个简单的 MDM server(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女人为什么喜欢偷男人(经常偷人的女人有什
- 下一篇: ae时间线快捷键(ae时间映射快捷键)