2012-07-03 9 views
6

Estoy tratando de firmar y cifrar .mobileconfig perfiles para dispositivos iOS.Cómo cifrar los perfiles de configuración móvil en iOS (en implementaciones OTA)?

Firma funciona perfectamente utilizando openssl::pkcs7 función de signo en rubí,

sin embargo el uso de la función de cifrar, consigo un conjunto de datos cifrados, pero Safari no se puede instalar el perfil diciendo "Perfil no válido".

Hay dos preguntas en este sentido:

  1. Qué datos del perfil .mobileconfig realidad está cifrada que entra en el (los datos) .. (/ datos) de la sección (clave) EncryptedPayloadContent (/ key)?

  2. ¿Están los datos en formato binario (.der) o están codificados en base64?

Cualquier ayuda en este sentido sería útil, ya que APPLE carece de documentación para encriptar los perfiles.

+0

No estoy seguro de que nunca sería capaz de hacer esto, ya que no puede instruir a Safari para descifrar sus perfiles antes de intentar para importarlo en el llavero del sistema. Como mencionas Safari, supongo que estás intentando instalar los perfiles a través de eso. ¿Quizás pueda almacenarlos encriptados en el servidor, descifrar bajo petición (introducir una clave en un formulario html, etc.) y enviar la versión descifrada a través de SSL al dispositivo? – Soup

Respuesta

0

Esta pregunta es igual a another question. ¡Reposicionando la respuesta aquí, con algunas modificaciones!

He usado OpenSSL módulo disponible en Ruby y Plist gema.

Considere un perfil de restricción de código de acceso.

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 
      } 

Por lo general, para un perfil normal de la passcode_payload_content entra en el passcode_payload['PayloadContent'] como conjunto de diccionarios.

passcode_payload [ 'PayloadContent'] = [passcode_payload_content]

Pero para un perfil de cifrado, PayloadContent deben ser retirados y EncryptedPayloadContent debe utilizarse como por la configuration profile key reference document.

Pregunta 1: ¿Quédatos del perfil .mobileconfig sea en realidad cifrado que va en el (los datos) .. (/ datos) sección del EncryptedPayloadContent (llave) (/ clave)

de el doc,

Para cifrar un perfil de hacer lo siguiente:

  • quitar la matriz PayloadContent y serializarlo como un plist adecuada.
  • Tenga en cuenta que el objeto de nivel superior en este plist es una matriz, no un diccionario .
  • CMS: encripta el plist serializado como datos envueltos. Serializar los datos cifrados en formato DER.
  • Establecer los datos serializados como el valor de un punto plist de datos en el perfil, utilizando la clave EncryptedPayloadContent
  • Desde la parte superior objeto de nivel en el plist debe ser una matriz

    passcode_payload_content_array = [passcode_payload_content] 
    

    Serialización a la plist apropiada

    to_be_encrypted_plist = passcode_payload_content_array.to_plist 
    

    Encriptación del contenido del certificado t,

    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) 
    

    Pregunta 2:son los datos en formato binario (.der) o codificado base 64?

    Agregar contenido de la carga útil cifrada a la carga útil original en formato der

    passcode_payload['EncryptedPayloadContent'] = StringIO.new(encrypted_payload.to_der) 
    
    Cuestiones relacionadas