如何加密iOS中的移动配置文件(在OTA部署中)?

时间:2012-07-03 09:14:06

标签: ios ruby cocoa

我正在尝试为iOS设备签署和加密.mobileconfig个人资料。

使用ruby中的openssl::pkcs7符号函数完美签名,

然而,使用加密功能,我获得了加密数据,但Safari无法安装配置文件,说“无效的配置文件”

这方面有两个问题:

  1. .mobileconfig配置文件中的哪些数据实际上是加密的 进入(键)的(数据)..(/ data)部分 EncryptedPayloadContent(/ key)?

  2. 数据是二进制格式(.der)还是base64编码?

  3. 这方面的任何帮助都会有所帮助,因为APPLE严重缺乏加密配置文件的任何文档。

1 个答案:

答案 0 :(得分:0)

此问题与another question相同。在这里重新给出答案,做一些修改!

我使用了Ruby中的OpenSSL模块和Plist gem。

考虑密码限制配置文件。

passcode_payload ={
              'PayloadUUID' => 'RANDOM_STRING_UUID',
              'PayloadOrganization' => 'PayloadOrganization',
              'PayloadVersion' => 1,
              'PayloadIdentifier' => 'com.test.PayloadIdentifier',
              'PayloadType' => 'Configuration',
              'PayloadDisplayName' => 'PayloadDisplayName',
              'PayloadRemovalDisallowed' => false
            }
  passcode_payload_content = {
              'PayloadDescription' => 'PayloadDescription',
              'PayloadDisplayName' => 'PayloadDisplayName',
              'PayloadIdentifier' => 'PayloadIdentifier',
              'PayloadOrganization' => 'PayloadOrganization',
              'PayloadType' => 'com.apple.mobiledevice.passwordpolicy',
              'PayloadUUID' => "RANDOM_STRING_UUID",
              'PayloadVersion' => 1,
              'allowSimple' => true,
              'forcePIN' => true
              'maxPINAgeInDays' => 20,
              'minComplexChars' => 1,
              'minLength' => 4,
              'requireAlphanumeric' => true
            }

通常,对于正常的配置文件,passcode_payload_content会作为字典数组进入passcode_payload['PayloadContent']

passcode_payload ['PayloadContent'] = [passcode_payload_content]

但对于加密的个人资料,应删除PayloadContent,并根据configuration profile key reference document使用EncryptedPayloadContent

问题1: 来自.mobileconfig配置文件的哪些数据实际上已加密进入(密钥)EncryptedPayloadContent(/ key)的(数据)...(/ data)部分

来自doc,

  

要加密配置文件,请执行以下操作:   

  • 删除PayloadContent数组并将其序列化为正确的plist。
  •   
  • 请注意,此plist中的顶级对象是数组,而不是a   字典。
  • CMS将序列化plist加密为封装数据。   以DER格式序列化加密数据。
  • 将序列化数据设置为   使用键在配置文件中作为Data plist项的值   EncryptedPayloadContent
  • 因为plist中的顶级对象应该是一个数组

    passcode_payload_content_array = [passcode_payload_content]
    

    序列化为正确的plist

    to_be_encrypted_plist = passcode_payload_content_array.to_plist
    

    加密证书有效内容

    device_certificate = OpenSSL::X509::Certificate.new File.read('deviceIdentityCertificate.pem')
    encrypted_payload = OpenSSL::PKCS7.encrypt([device_certificate],to_be_encrypted_plist, OpenSSL::Cipher::Cipher::new("des-ede3-cbc"),OpenSSL::PKCS7::BINARY)
    

    问题2: 数据是二进制格式(.der)还是base64编码?

    将加密的有效内容添加到原始有效负载格式

    passcode_payload['EncryptedPayloadContent'] = StringIO.new(encrypted_payload.to_der)