创建一个简单的 MDM server(1)
前提:已獲得 APNS 證書 ,已完畢 MDM 配置描寫敘述文件的制作。請(qǐng)參考《 MDM 證書申請(qǐng)流程 》一文和《配置MDM Provisioning Profile》。
環(huán)境:OSX 10.9.2,JDK 1.6。Eclipse JavaEE Helois,Tomcat 7.0
一、前言
《THE IOS MDMPROTOCOL》(即Inside Apple MDM)一文中描寫敘述了一個(gè)簡(jiǎn)單 MDM Server Python 實(shí)現(xiàn)(server.py)。
筆者也曾參照此文配置,但在安裝M2Crypto 一步時(shí)遇到一個(gè) cc 參數(shù)沒有定義錯(cuò)誤。實(shí)在無法進(jìn)行下去,因此不得不放棄。在參照《基于IOS上MDM技術(shù)相關(guān)資料整理及匯總》一文時(shí),發(fā)現(xiàn)其使用了商業(yè)SSL證書(StartSSL)。而筆者使用的自簽名SSL證書,有些步驟不太一樣 ,另外在一些關(guān)鍵點(diǎn)也須要讀者自己摸索,因此有了本文的誕生。
二、準(zhǔn)備
無論 APNS 還是 MDM,都須要server實(shí)現(xiàn) https。如果我們使用 Eclipse 調(diào)試 Tomcat,則須要改動(dòng) Servers 項(xiàng)目以下的Tomcat 配置文件 server.xml。詳細(xì)過程請(qǐng)參考《開啟 Tomcat https 服務(wù)》。
三、 實(shí)現(xiàn) checkin URL
MDM 須要實(shí)現(xiàn)完整 APNS 服務(wù),對(duì)此我們採用的是第三方的 java apns 實(shí)現(xiàn)。
主要是 notnoop 的 Java apns(不是google 的 JavaPNS),此外,還有 xmlwise ,用于解析蘋果的 plist 文檔。
java apns有兩個(gè)包:apns-0.1.5.jar 和 apns-0.1.5-jar-with-dependencies.jar包。
前者是 API,后者是依賴包。
xmlwise 就一個(gè)包:xmlwise-1_2.jar。
數(shù)據(jù)庫採用 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 數(shù)據(jù)庫,創(chuàng)建兩張表。用于設(shè)備注冊(cè):
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;
首先看注冊(cè)服務(wù)。設(shè)備注冊(cè)由Servlet checkin 實(shí)現(xiàn)。其 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 主要處理與注冊(cè)相關(guān)的兩種消息:Authenticate 和 TokenUpdate。
在設(shè)備注冊(cè)中,server首先收到Authenticate 消息,checkin 將之計(jì)入 Authenticate 表,然后返回一個(gè)空的 plist 文件。設(shè)備隨后會(huì)發(fā)來TokenUpdate 消息。checkin 也會(huì)將之存到 TokenUpdate 表并返回空 plist 文件。在 TokenUpdate 消息的處理中,checkin獲取的是 UDID、device token、push magic和 unlock 等 MDM push中將要用到的重要字段。
當(dāng)中,token(即 APNS 中的 device token)須要特別注意。
由于在蘋果的文檔中說,這是一個(gè)32位長度的字符串。
實(shí)際上我們都知道APNS 中,device token 是一個(gè) byte 數(shù)組。
在 TokenUpdate 消息中,iOS 將 device token 的 byte 數(shù)組進(jìn)行了base64 編碼,結(jié)果變成了一個(gè) 44 字節(jié)長度的 string。也就是說在 TokenUpdate 消息中。<token>字段的值類型應(yīng)該是<string>,而不應(yīng)該是消息中定義的<data>。
一個(gè)典型的 TokenUpdate 消息,其 token 描寫敘述例如以下:
<key>Token</key>
<data> [ 32 byte string, base64 encoded,redacted ]</data>
顯然,這里的<data>必須換成<string>。xmlwise 包中的 Plist 類才干正確解析。
由于在 Plist 類中,對(duì)于 plist 文件里的數(shù)據(jù)類型<data>會(huì)被解析為 byte 數(shù)組而不是字符串。
因此 checkin 在處理 TokenUpdate 消息時(shí)。採取了額外的手段來獲取 token 字段,即正則捕獲。
執(zhí)行 Tomcat server,將 iPad 接入server統(tǒng)一 wifi 網(wǎng)絡(luò),然后在瀏覽器中訪問描寫敘述文件地址:
https://192.168.2.1:8443/mdmtest/client.mobileconfig
此時(shí) safari 將調(diào)用設(shè)置程序,在客戶端安裝 mdm 配置描寫敘述文件。當(dāng)你點(diǎn)擊“安裝”button,iPad 會(huì)請(qǐng)求 checkin URL地址,并發(fā)送Authenticate 消息和 TokenUpdate 消息。你能夠在數(shù)據(jù)庫中查看到這兩條消息。
轉(zhuǎn)載于:https://www.cnblogs.com/liguangsunls/p/6701342.html
總結(jié)
以上是生活随笔為你收集整理的创建一个简单的 MDM server(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女人为什么喜欢偷男人(经常偷人的女人有什
- 下一篇: Digui