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)
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