日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

创建一个简单的 MDM server(1)

發布時間:2023/12/2 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 创建一个简单的 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。