一)配置IIS加密连接,ios系统升级7.1后已经无法使用http进行企业内部署,为了满足mdm的加密需求以及大厅的初始化安装需要进行生成自签名证书

1)配置MIME
cer application/x-x509-ca-cert
.mobileconfig application/x-apple-aspen-config

2)brew install go (如果无法link成功请运行brew prune )
go get github.com/deckarep/EasyCert
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
使用附件中的go文件替换src下的源文件,修改certName和hostName为发证单位和服务器信息(区分域名和IP地址)
go build EasyCert
easycert

3)mmc导入信任根节点myCA.cer(使用自签名的话后面IPCU中要导入根证书)
IIS导入server.pfx,设置证书,设置绑定(要重启)
下载IPCU,使用myCA.cer作为描述文件的证书,client.pfx作为mdm的验证证书

二)配置MDM

1)新建一个文件夹,然后拷贝上一步生成的server.req ,server.pfx,server.key 到该文件夹,使用server.req向developercenter请求msr证书,下载获得的证书文件mdm.cer

openssl x509 -inform der -in mdm.cer -out mdm.pem

openssl genrsa -des3 -out customerPrivateKey.pem 2048
openssl req -new -key customerPrivateKey.pem -out customer.csr -subj '/C=CN/ST=BeiJing/L=BeiJing/CN=10.18.3.33'
openssl req -inform pem -outform der -in customer.csr -out customer.der

2)从git下载mdmvendor生成plist.然后去苹果网站生成证书

python mdm_vendor_sign.py --csr customer.csr --key server.key --mdm mdm.cer

下载pem文件重命名(MDMYTHT.pem)
查看证书信息信息
openssl x509 -noout -in mdmYTHT.pem -issuer -subject -dates
将UID拷贝出来,这个是MDM中的Topic信息( com.apple.mgmt.External.e617f289-3be5-4df7-90fa-5ec8f75d8c98)

3)导出发送MDM信息的证书文件

openssl rsa -in customerPrivateKey.pem -out PlainKey.pem
cat MDMYTHT.pem PlainKey.pem > PlainCert.pem
openssl pkcs12 -export -out mdmapnscertificate.pfx -inkey PlainKey.pem -in MDMYTHT.pem

mdmapnscertificate.pfx作为推送证书在PushSharp中使用

三)iis配置接收PUT

<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules>
<remove name="WebDAVModule" />
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
<add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
</modules>
<handlers accessPolicy="Read, Write, Execute, Script">
<remove name="StaticFile" />
<remove name="SimpleHandlerFactory-ISAPI-2.0" />
<remove name="WebDAV" />
<remove name="SimpleHandlerFactory-Integrated-4.0" />
<remove name="SimpleHandlerFactory-Integrated" />
<add name="SimpleHandlerFactory-Integrated" path="*.ashx" verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.UI.SimpleHandlerFactory" resourceType="Unspecified" requireAccess="Write" preCondition="integratedMode" />
<add name="SimpleHandlerFactory-Integrated-4.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.UI.SimpleHandlerFactory" resourceType="Unspecified" requireAccess="Write" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="SimpleHandlerFactory-ISAPI-2.0" path="*.ashx" verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
<add name="StaticFile" path="*" verb="GET,HEAD,POST,DEBUG,PUT,DELETE" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
<add name="FileRequest" path="*.pdf,*doc,*docx,*.pptx,*.ppt,*.pps" verb="*" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="File" preCondition="classicMode,runtimeVersionv4.0,bitness64" />
<add name="Telerik_Web_UI_WebResource_axd" verb="*" preCondition="integratedMode" path="Telerik.Web.UI.WebResource.axd" type="Telerik.Web.UI.WebResource" />
<add name="Telerik_Web_UI_DialogHandler_aspx" verb="*" preCondition="integratedMode" path="Telerik.Web.UI.DialogHandler.aspx" type="Telerik.Web.UI.DialogHandler" />
<add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
</handlers>
<security>
<authorization>
<remove users="*" roles="" verbs="" />
<add accessType="Allow" users="*" verbs="GET,HEAD,POST,PUT,DELETE,DEBUG" />
</authorization>
</security>
<staticContent>
<!--<mimeMap fileExtension=".gw2" mimeType="application/octet-stream"/>
<mimeMap fileExtension=".svg" mimeType="image/svg-xml"/>-->
</staticContent>
<directoryBrowse showFlags="Extension" />
<httpErrors errorMode="Detailed" />
</system.webServer>

  

四)获取设备Checkin的信息(如果要区分设备,需要建立页面接收用户输入的名称然后修改chekcin地址并生成mobieconfig文件供下载,使用自签名证书的话无法给改文件签名)

 StreamReader stream = new StreamReader(context.Request.InputStream);
string x = stream.ReadToEnd();
string xml = HttpUtility.UrlDecode(x);
Console.WriteLine(xml);
var result = (Dictionary<string, object>)PlistCS.Plist.readPlistSource(xml);
if (result["MessageType"].ToString() == "Authenticate")
{
XbModel.XNOAEntities xnoa = new XbModel.XNOAEntities();
var udid = result["UDID"].ToString();
XbModel.MdmData mdmdata = xnoa.MdmData.FirstOrDefault(xx => xx.UDID == udid);
if (mdmdata == null)
{
mdmdata = new XbModel.MdmData();
mdmdata.UDID = result["UDID"].ToString();
mdmdata.Topic = result["Topic"].ToString();
xnoa.MdmData.Add(mdmdata);
xnoa.SaveChanges();
}
context.Response.Clear();
context.Response.ContentType = "text/xml";
context.Response.Write(APSP.Common.FileHelper.ReadFile(context.Server.MapPath("~/ForMobile/blank.plist")));
context.Response.End();
}
if (result["MessageType"].ToString() == "TokenUpdate")
{
XbModel.XNOAEntities xnoa = new XbModel.XNOAEntities();
var udid=result["UDID"].ToString();
XbModel.MdmData mdmdata = xnoa.MdmData.FirstOrDefault(xx => xx.UDID ==udid );
if (mdmdata != null)
{
mdmdata.PushMagic = result["PushMagic"].ToString();
mdmdata.Token = (byte[])result["Token"];
mdmdata.UnlockToken = (byte[])result["UnlockToken"];
xnoa.SaveChanges();
}
context.Response.Clear();
context.Response.StatusCode = 200;
context.Response.End();
}

  

五)推送MDM信息

var xnoa = new XNOAEntities();

            var appleCert = File.ReadAllBytes(@"mdmpush.pfx");

            var appleset = new ApplePushChannelSettings(true, appleCert, "******", true);

            var push = new ApplePushService(appleset);

            push.OnNotificationFailed += new PushSharp.Core.NotificationFailedDelegate(push_OnNotificationFailed);
push.OnNotificationSent += (sender, notification1) => Console.WriteLine("NOTIFICATION Send: " + ((AppleNotification)notification1).DeviceToken);
push.OnNotificationRequeue += (sender, e) => Console.WriteLine("REQUEUE: " + ((AppleNotification)e.Notification).Identifier);
push.OnServiceException += new PushSharp.Core.ServiceExceptionDelegate(push_OnServiceException);
foreach (var mdmcommand in xnoa.MdmCommand.Where(x => x.CommandStatus == "-1"))
{
String pushMagicString = mdmcommand.PushMagic; String token = mdmcommand.Token;// BitConverter.ToString(mdmdata.Token).Replace("-", string.Empty);
Console.WriteLine("Device Token length is: " + token.Length);
Console.WriteLine("DeviceToken is: " + token);
Console.WriteLine("PushMagic is: " + pushMagicString);
var notification = new AppleNotification(token, new AppleNotificationPayload()).WithCustomItem("mdm", mdmcommand.PushMagic);
Console.WriteLine(notification.ToString());
push.QueueNotification(notification); } Console.WriteLine("Waiting for Queue to Finish..."); //Stop and wait for the queues to drains
push.Stop(true); Console.WriteLine("Queue Finished, press return to exit...");

  

ios设备mdm的实现过程的更多相关文章

  1. 转:基于IOS上MDM技术相关资料整理及汇总

    一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企业宝贵的资产,安全问题更是重中之重,在移动互联网时代,员工个人的设备接入 ...

  2. MDM基于IOS设备管控功能的所有命令介绍

    前面我们介绍了IOS上MDM几个简单的控制命令的发送和返回数据的解析处理,下面我们介绍一下MDM涉及到的命令的操作介绍: 一.Control Commands(控制类命令) 1.Device Lock ...

  3. 基于IOS和Android设备MDM技术方案服务价格

    导读:前段时间 www.mbaike.net 博客被恶意攻击,导致程序崩溃,目前已经替换了以前的Wordpress程序,现提供IOS和Android版本MDM的代码和相关文档咨询服务. 一.IOS版M ...

  4. 基于IOS上MDM技术相关资料整理及汇总

    (转自:http://www.mbaike.net/special/1542.html) 一.MDM相关知识:MDM (Mobile Device Management ),即移动设备管理.在21世纪 ...

  5. 【转】iOS设备的UDID是什么?苹果为什么拒绝获取iOS设备UDID的应用?如何替代UDID?

    本文讲诉的主要是为什么苹果2011年8月发布iOS 5后就开始拒绝App获取设备的UDID以及UDID替补方案,特别提醒开发者苹果App Store禁止访问UDID的应用上架(相关推荐:APP被苹果A ...

  6. ios设备 分辨率(转)

    1 iOS设备的分辨率 iOS设备,目前最主要的有3种(Apple TV等不在此讨论),按分辨率分为两类 iPhone/iPod Touch 普屏分辨率    320像素 x 480像素 Retina ...

  7. iOS不越狱装收费App——注册iOS设备为开发者工具

    额,这篇教程主要是我写下来用于总结注册iOS设备和用iResign安装App的过程,想要不越狱安装App当然有办法,但是有几个前提--你是一个Apple开发者,或者你有个朋友是App的开发者.如果没有 ...

  8. iOS设备per app vpn,什么是什么系统的要求,必须?

    坑爹Apple网站信息MDM厂商资料,最有发言权iOS 7.x设备支持per app vpn该,但它没有说明是什么系统要求环保要求. 1. iOS 7.x 设备.当然 2. iOS 7.x 需要设备M ...

  9. iOS学习——获取iOS设备的各种信息

    不管是在Android开发还是iOS开发过程中,有时候我们需要经常根据设备的一些状态或信息进行不同的设置和性能配置,例如横竖屏切换时,电池电量低时,内存不够时,网络切换时等等,我们在这时候需要进行一些 ...

随机推荐

  1. const变量初始化问题

    在C++中const变量定义时必须进行初始化,否则无法通过编译. 初始化的方式有多种,可以通过字面值对其进行初始化,也可以通过变量对其初始化,或其他方式,只要能给const变量赋初值即可(当然初值应该 ...

  2. 微软2016校园招聘4月在线笔试 A FontSize

    题目链接:http://hihocoder.com/problemset/problem/1288 分析:题目中所求的是最大的FontSize(记为S),其应该满足P*[W/S]*[H/S] > ...

  3. (转)Android消息处理机制(Handler、Looper、MessageQueue与Message)

    转自 http://www.cnblogs.com/angeldevil/p/3340644.html Android消息处理机制(Handler.Looper.MessageQueue与Messag ...

  4. INI配置文件分析小例子

    随手写个解析INI配置字符串的小例子 带测试 #include <iostream> #include <map> #include <string> #inclu ...

  5. ASCII、Unicode、GBK和UTF-8字符编码的区别联系

    转自http://dengo.org/archives/901 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称 ...

  6. 121. Best Time to Buy and Sell Stock (一) leetcode解题笔记

    121. Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of ...

  7. AC算法 及python实现

    零 导言 软件安全课上,老师讲了AC算法,写个博客,记一下吧. 那么AC算法是干啥的呢? ——是为了解决多模式匹配问题.换句话说,就是在大字符串S中,看看小字符串s1, s2,...有没有出现. AC ...

  8. ASP.NET ashx实现无刷新页面生成验证码

    现在大部分网站登陆时都会要求输入验证码,在网上也看了一些范例,现在总结一下如何实现无刷新页面生成验证码. 效果图: 实现方式: 前台: <div> <span>Identify ...

  9. 老版mapreduce跑streaming作业多路输出的方法

    1. 继承MultipleTextOutputFormat实现自己的输出类. 2. 重写generateFileNameForKeyValue方法,返回输出的名字,可通过"/"分割 ...

  10. 图片预加载和AJAX的图片预加载

    利用js实现图片预加载,加载所需要图片的路径与名称即可,很容易实现,该方法尤其适用预加载大量的图片: <div class="hidden"> <script t ...