您好,欢迎来到二三四教育网。
搜索
您的当前位置:首页iOS MDM开发

iOS MDM开发

来源:二三四教育网

前言

关于MDM,谷歌搜遍了也搜不出多少资料,甚至有的资料会误导小伙伴们。我实现了MDM并且整理了一份详细的文档,供大家参考,表述有误之处请见谅并及时在评论里告知我修改。

参考链接:

参考文档:(链接我就不放了,大家自己找吧,找不到也没关系)

InsideAppleMDM.pdf
CommandReference.pdf

正文

以下“服务器”都是指MDM服务器,而且必须是https服务器

MDM服务器与APNS、设备的大致通信流程

1、生成并配置好mobileconfig文件,放在服务器上
2、设备访问服务器上的mobileconfig文件,点击注册以及信任按钮后,设备主动发起请求mobileconfig里的checkin URL。设备首先发起Authenticate,服务端录入数据后返回空plist,接着设备发起TokenUpdate,服务端录入数据后返回空plist。
3、以锁屏为例,服务端将锁屏命令发给APNS,当苹果的 APNS 服务器通知设备访问 MDM 服务器时,设备首先会向服务器(mobileconfig里的server URL)发送一个Status:Idle 消息(如果设备空闲),表示 MDM 服务器现在可以把指令取给它执行。服务器组装成 Plist 文件响应给它。
4、设备执行完命令,会再次向 server 发送 Acknowledged 消息,告诉服务器执行状态,然后服务器简单回复一个空响应(即200),并关闭连接。

以下是MDM vendor和customer申请制作

MDM Vendor申请(必须是企业版开发者账号)

MDM 证书制作和申请

(建议在Mac电脑下操作,如果是Windows则要先安装openssl和python,(Mac自带了它们),而且命令可能有区别,建议所有文件都统一放到一个文件夹下!所有命令都在该文件夹下操作!以下步骤需要输入密码,请务必记住密码,建议统一所有密码!)
创建MDM Vendor CSR,并上传到developer center创建MDM证书
创建MDM推送CSR
导出私钥并制作证书
1、点击展开mdm.cer安装到钥匙串的证书,导出私钥为private.p12,保存。
2、将私钥private.p12提取出私钥
openssl pkcs12 -in private.p12 -nocerts -out key.pem
3、提取证书
openssl pkcs12 -in private.p12 -clcerts -nokeys -out cert.pem
4、将证书转换成DES格式
openssl x509 -in cert.pem -inform PEM -out mdm.cer -outform DES
5、去掉private key密码
openssl rsa -in key.pem -out private.key
使用mdm_vendor_sign工具制作CSR

2、运行python mdm_vendor_sign.py --key private.key --csr mdm_push.certSigningRequest --mdm mdm.cer --out applepush.csr
3、运行成功后,会提示 Go upload file 'applepush.csr' to  !,否则为不成功。
4、如果不成功,则需要做一些改动:
首先手动下载AppleWWDRCA.cer证书到此目录 
修改mdm_vendor_sign.py 代码128行为:intermediate_cer = open(‘AppleWWDRCA.cer','r').read()
再次运行即可。
从Apple获取推送证书

2、下载推送证书,安装到钥匙串,显示 APSP:xxxxxx
3、导出该推送证书为p12,给服务端使用。

MDM Customer

(Vendor生成后的证书是通用的,而接下来的customer则是和服务器地址有关,所以更换服务器地址时则要重新完成以下步骤)
生成配置mobileconfig文件

实现了功能还不够,仍然有几个问题需要解决:

1、客户端如何检查是否已安装了描述文件?(即是否可控?):

+ (BOOL)IsCertificatesTrusted:(NSArray<NSData *> *)certDatas {
    
    if (certDatas.count == 0) {
        return NO;
    }
    
    CFMutableArrayRef certs = CFArrayCreateMutable(CFAllocatorGetDefault(), 0, &kCFTypeArrayCallBacks);
    
    for (NSData *certData in certDatas) {
        SecCertificateRef cert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef) certData);
        if (!cert) {
            continue;
        }
        
        CFArrayAppendValue(certs, cert);
        CFRelease(cert);
    }
    
    SecPolicyRef policy = SecPolicyCreateBasicX509();
    SecTrustRef trust;
    
    OSStatus err = SecTrustCreateWithCertificates(certs, policy, &trust);
    CFRelease(certs);
    CFRelease(policy);
    if (!trust) {
        return NO;
    }
    if (err != errSecSuccess) {
        CFRelease(trust);
        return NO;
    }
    
    SecTrustResultType trustResult = -1;
    err = SecTrustEvaluate(trust, &trustResult);
    CFRelease(trust);
    if (err != errSecSuccess) {
        return NO;
    }
    
    if(trustResult == kSecTrustResultUnspecified) {
        return YES;
    } else {
        return NO;
    }
}

</code>
</pre>

2、断网情况下移除描述文件,服务器如何更新数据库?

https生成自签名证书

一、创建CA证书
1、创建一个私钥,命名为rootCA.key
openssl genrsa -out rootCA.key 2048
2、创建根证书,命名为rootCA.cer,(common name填写服务器地址)
openssl req -x509 -new -key rootCA.key -out rootCA.cer -days 730
######二、制作自签名 SSL 证书
1、创建一个私钥,命名为server.key
openssl genrsa -out server.key 2048
2、创建CSR
openssl req -new -out server.req -key server.key -subj /CN=127.0.0.1/CN=填写服务器地址/CN=localhost
3、用CSR创建SSL证书
openssl x509 -req -in server.req -out server.cer -CAkey rootCA.key -CA rootCA.cer -days 36500 -CAcreateserial -CAserial server.serial
4、将 .key 和 .cer 文件导出为 .p12 证书
openssl pkcs12 -export -in server.cer -inkey server.key -out server.p12 -name "server"
5、将 .p12 文件导入到 Java keystore 中
keytool -importkeystore -v -srckeystore server.p12 -srcstoretype pkcs12 -srcstorepass 密码 -destkeystore server.keystore -deststoretype jks -deststorepass 密码

Copyright © 2019- how234.cn 版权所有 赣ICP备2023008801号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务