前言
关于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 密码