我正在尝试.mobileconfig
为iOS设备签名和加密配置文件.
签名openssl::pkcs7
在ruby中使用sign函数完美地工作,
但是使用加密功能,我得到一个加密数据,但Safari无法安装配置文件说"无效的配置文件".
这方面有两个问题:
来自.mobileconfig配置文件的哪些数据实际上是加密进入(密钥)EncryptedPayloadContent(/ key)的(data)..(/ data)部分?
数据是二进制格式(.der
)还是base64编码?
在这方面的任何帮助都会有所帮助,因为APPLE在加密配置文件时严重缺乏任何文档.
这个问题与另一个问题相同。在这里重新发布答案,并进行一些修改!
我使用了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
}
Run Code Online (Sandbox Code Playgroud)
通常对于普通配置文件,它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]
Run Code Online (Sandbox Code Playgroud)
序列化到正确的 plist
to_be_encrypted_plist = passcode_payload_content_array.to_plist
Run Code Online (Sandbox Code Playgroud)
加密证书有效负载内容,
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)
Run Code Online (Sandbox Code Playgroud)
问题2: 数据是二进制格式(.der)还是base64编码的?
以der格式将加密的payload内容添加到原始payload中
passcode_payload['EncryptedPayloadContent'] = StringIO.new(encrypted_payload.to_der)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1277 次 |
最近记录: |