как зашифровать и подписать файл конфигурации мобильного телефона iphone, используя Ruby - PullRequest
3 голосов
/ 17 августа 2011

У меня есть неподписанный файл mobileconfig в формате xml (шаблон), созданный утилитой конфигурации iphone. Я хотел бы зашифровать и подписать его с помощью openssl и иметь возможность установить его на iphone, используя Ruby на рельсах. Я не хочу создавать сервер SCEP для этого, так как я хочу продолжать динамически изменять этот xml-файл шаблона и обслуживать его, используя какой-то URL.

Заранее спасибо за помощь.

Я уже проверил следующий вопрос, но из него не ясно, как зашифровать файл, который может быть корректно установлен на iphone - поскольку я продолжаю получать «файл конфигурации не может быть установлен из-за неизвестной ошибки», когда я пытался имитировать зашифрованный формат файла из утилиты конфигурации iphone, зашифровав только часть и добавив / добавив другие части файла конфигурации соответствующим образом.

Подписание XML-профиля конфигурации iPhone с помощью Ruby on Rails

Это руководство Apple полезно, но оно больше предназначено для создания сервера SCEP, а не для манипулирования файлом шаблона mobileconfig -

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/iPhoneOTAConfiguration/profile-service/profile-service.html

Ответы [ 2 ]

2 голосов
/ 19 мая 2015

Если у кого-то все еще есть проблемы с подписью и шифрованием профиля с помощью 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" 

для отправки полезной нагрузки.

0 голосов
/ 24 августа 2011

Упомянутая вами ссылка говорит только о подписании профиля конфигурации iPhone. Подходит ли вам хотя бы подпись профиля?
Вы можете проверить правильность подписи, сгенерированной вашим кодом, используя утилиту командной строки openssl. Запишите сгенерированную подпись в файл и используйте следующую команду для проверки подписи и извлечения исходных данных из подписи pkcs # 7.

openssl smime -verify -inform DER -inign_config.p7s -signer your_signing_certificate -out data.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...