6

.mobileconfigiOS デバイスのプロファイルに署名して暗号化しようとしています。

openssl::pkcs7ruby の sign 関数を使用すると、署名が完全に機能します。

ただし、暗号化機能を使用すると、暗号化されたデータを取得できますが、Safari は「無効なプロファイル」と言ってプロファイルのインストールに失敗します。

これに関しては、次の 2 つの質問があります。

  1. (key) EncryptedPayloadContent (/key) の (data)..(/data) セクションに実際に暗号化される .mobileconfig プロファイルのデータはどれですか?

  2. データはバイナリ形式 ( .der) または base64 でエンコードされていますか?

APPLEにはプロファイルの暗号化に関するドキュメントがまったくないため、この点に関するヘルプは役に立ちます。

4

1 に答える 1

0

この質問は別の質問と同じです。いくつかの変更を加えて、ここに回答を再投稿してください!

Ruby とPlist gemで利用可能なOpenSSLモジュールを使用しました。

パスコード制限プロファイルを検討してください。

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
            }

通常、通常のプロファイルの場合、辞書の as 配列にpasscode_payload_content入ります。passcode_payload['PayloadContent']

passcode_payload['PayloadContent'] = [passcode_payload_content]

ただし、暗号化されたプロファイルの場合は、PayloadContentを削除し 、構成プロファイル キー リファレンス ドキュメントEncryptedPayloadContentに従って使用する必要があります。

質問 1: (key) EncryptedPayloadContent (/key) の (data)..(/data) セクションに入る、.mobileconfig プロファイルのどのデータが実際に暗号化されるか

ドキュメントから、

プロファイルを暗号化するには、次の手順を実行します。

  • 配列を削除PayloadContentし、適切な plist としてシリアル化します。
  • この plist の最上位オブジェクトは配列であり、辞書ではないことに注意してください。
  • シリアル化された plist をエンベロープ データとして CMS 暗号化します。暗号化されたデータを DER 形式でシリアル化します。
  • キーを使用して、シリアル化されたデータをプロファイルのデータ plist アイテムの値として設定します。 EncryptedPayloadContent
  • plist の最上位オブジェクトは配列でなければならないため

    passcode_payload_content_array = [passcode_payload_content]
    

    適切な plist へのシリアル化

    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)
    

    質問 2: データはバイナリ形式 (.der) または base64 でエンコードされていますか?

    暗号化されたペイロード コンテンツを元のペイロードに der 形式で追加する

    passcode_payload['EncryptedPayloadContent'] = StringIO.new(encrypted_payload.to_der)
    
    于 2015-05-20T05:00:29.613 に答える