3 votes

Comment chiffrer et signer le fichier de configuration mobile iPhone en utilisant Ruby

J'ai un fichier mobileconfig non signé au format XML (modèle) généré par l'utilitaire de configuration iPhone. J'aimerais le chiffrer et le signer en utilisant openssl et pouvoir l'installer sur iPhone en utilisant Ruby on Rails. Je ne veux pas créer de serveur SCEP pour faire cela car je veux continuer à modifier ce fichier XML modèle de manière dynamique et le servir en utilisant une URL.

Merci pour votre aide à l'avance.

J'ai déjà vérifié la question suivante mais il n'est pas clair de là comment chiffrer le fichier qui peut être installé correctement sur iPhone - car je continue à obtenir "le fichier de configuration n'a pas pu être installé en raison d'une erreur inconnue" quand j'ai essayé de reproduire le format de fichier chiffré de l'utilitaire de configuration iPhone en ne chiffrant que la partie data et en ajoutant/enlevant d'autres parties du fichier de configuration de manière appropriée.

Signature du profil XML de configuration de l'iPhone avec Ruby on Rails

Ce manuel d'Apple est utile mais il est plus orienté vers la création d'un serveur SCEP et non pour la manipulation du fichier mobileconfig modèle -

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

2voto

BinaryMee Points 1424

Dans le cas où quelqu'un rencontre toujours des problèmes pour signer et chiffrer le profil avec Ruby, la réponse suivante serait utile.

J'ai utilisé le module OpenSSL disponible en Ruby et la gemme Plist.

Considérez un profil de restriction de code d'accès.

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
            }

**

Chiffrement

**

Normalement, pour un profil normal, le passcode_payload_content est placé dans le passcode_payload['PayloadContent'] comme un tableau de dictionnaires.

passcode_payload['PayloadContent'] = [passcode_payload_content]

Mais pour un profil chiffré, le PayloadContent doit être supprimé et EncryptedPayloadContent doit être utilisé comme indiqué dans le document de référence des clés de profil de configuration.

d'après le document,

Pour chiffrer un profil, faites ce qui suit :

  • Supprimez le tableau PayloadContent et sérialisez-le comme un plist approprié.
  • Remarquez que l'objet de niveau supérieur dans ce plist est un tableau, pas un dictionnaire.
  • Chiffrer le plist sérialisé en tant que données enveloppées CMS. Sérialisez les données chiffrées au format DER.
  • Définissez les données sérialisées comme la valeur d'un élément plist de type Données dans le profil, en utilisant la clé EncryptedPayloadContent

Étant donné que l'objet de niveau supérieur dans le plist doit être un tableau

passcode_payload_content_array = [passcode_payload_content]

Sérialisation en un plist approprié

to_be_encrypted_plist = passcode_payload_content_array.to_plist

Chiffrement du contenu du certificat de payload,

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)

Ajouter le contenu chiffré du payload à la charge utile d'origine au format der

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

**

Signature

**

signed_passcode_profile = OpenSSL::PKCS7.sign(SSL_CERTIFICATE, SSL_KEY, passcode_payload.to_plist, [], OpenSSL::PKCS7::BINARY)

Enfin, vous pouvez utiliser

send_data signed_passcode_profile.to_der, :type => "application/x-apple-aspen-config" 

pour envoyer la charge utile.

-1voto

Nilesh Points 1399

Le lien que vous avez mentionné parle uniquement de la signature du profil de configuration de l'iPhone. Est-ce qu'au moins la signature d'un profil fonctionne pour vous?
Vous pouvez vérifier que la signature générée par votre code est correcte en utilisant l'utilitaire en ligne de commande openssl. Écrivez la signature générée dans un fichier et utilisez la commande suivante pour vérifier la signature et extraire les données originales de la signature pkcs#7.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X