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.