如果仍然有人在使用 Ruby 签名和加密配置文件时遇到问题,以下答案会很有用。
我用过OpenSSLRuby 中提供的模块和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
应该被删除并且EncryptedPayloadContent
应按照配置文件关键参考文档.
从文档中,
要加密配置文件,请执行以下操作:
去除PayloadContent
数组并将其序列化为正确的 plist。
请注意,此 plist 中的顶级对象是一个数组,而不是一个
字典。 CMS 将序列化的 plist 加密为封装数据。
以 DER 格式序列化加密数据。 将序列化数据设置为
作为配置文件中的 Data plist 项的值,使用 keyEncryptedPayloadContent
由于 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)
以 der 格式将加密的负载内容添加到原始负载中
passcode_payload['EncryptedPayloadContent'] = StringIO.new(encrypted_payload.to_der)
**
Signing
**
signed_passcode_profile = OpenSSL::PKCS7.sign(SSL_CERTIFICATE, SSL_KEY, passcode_payload.to_plist, [], OpenSSL::PKCS7::BINARY)
最后,你可以使用
send_data signed_passcode_profile.to_der, :type => "application/x-apple-aspen-config"
发送有效负载。