Если у кого-то все еще есть проблемы с подписью и шифрованием профиля с помощью Ruby, следующий ответ будет полезен.
Я использовал OpenSSL модуль, доступный в Ruby и 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
и сериализуйте его как правильный список.
Обратите внимание, что объект верхнего уровня в этом списке является массивом, а не
словарь. CMS-шифрует сериализованный список в виде конвертированных данных.
Сериализация зашифрованных данных в формате DER. Установите сериализованные данные как
значение как элемент списка данных в профиле, используя ключ
EncryptedPayloadContent
Поскольку объект верхнего уровня в plist должен быть массивом
passcode_payload_content_array = [passcode_payload_content]
Сериализация на правильный лист
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)
**
Подписание
**
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"
для отправки полезной нагрузки.