6

我正在尝试.mobileconfig为 iOS 设备签名和加密配置文件。

openssl::pkcs7在 ruby​​ 中使用 sign 函数完美地进行签名,

但是使用加密功能,我得到一个加密的数据,但 Safari 无法安装配置文件说"Invalid Profile"

这方面有两个问题:

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

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

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

4

1 回答 1

0

这个问题与另一个问题相同。在这里重新发布答案,并进行一些修改!

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

考虑一个密码限制配置文件。

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']as 字典数组。

passcode_payload['PayloadContent'] = [passcode_payload_content]

但是对于加密的配置文件,PayloadContent应该删除并 EncryptedPayloadContent按照配置文件密钥参考文档使用。

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

从文档中,

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

  • 删除PayloadContent数组并将其序列化为适当的 plist。
  • 请注意,此 plist 中的顶级对象是一个数组,而不是字典。
  • 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编码的?

    将加密的payload内容添加到der格式的原始payload中

    passcode_payload['EncryptedPayloadContent'] = StringIO.new(encrypted_payload.to_der)
    
    于 2015-05-20T05:00:29.613 回答