2012-07-03 95 views
6

我正在嘗試爲iOS設備簽署並加密.mobileconfig配置文件。如何加密iOS中的移動配置配置文件(在OTA部署中)?

簽名的作品完美使用紅寶石openssl::pkcs7簽到功能,

但是使用加密功能,我得到一個加密的數據,但Safari瀏覽器沒有安裝該配置文件說「無效的配置文件」

有這方面的兩個問題:

  1. 從.mobileconfig分析哪些數據實際上是加密的 進入(數據)。(/數據)(密鑰)的部分 EncryptedPayloadContent(/ key)?

  2. 數據是二進制格式(.der)還是base64編碼?

在這方面的任何幫助將有所幫助,因爲APPLE在加密配置文件時嚴重缺乏任何文檔。

+0

我不知道你會永遠能夠做到這一點,因爲你不能命令野生動物園嘗試之前解密您的配置文件將其導入系統鑰匙串。既然你提到safari,我假設你正在嘗試通過它來安裝配置文件。也許你可以將它們加密存儲在服務器上,根據請求進行解密(在HTML表單中輸入密鑰等),並通過SSL將解密後的版本發送到設備上? – Soup

回答

0

此問題與another question相同。在此重新發布答案,並進行一些修改!

我已經使用了OpenSSL模塊在Ruby和Plist寶石。

考慮一個密碼限制配置文件。

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 
      } 

一般對於正常輪廓passcode_payload_content進入passcode_payload['PayloadContent']作爲字典的數組。

passcode_payload [ 'PayloadContent'] = [passcode_payload_content]

但是對於加密的輪廓,PayloadContent應被刪除並EncryptedPayloadContent應作爲每configuration profile key reference document

問題1:從.mobileconfig輪廓實際上是加密的哪些數據進入(數據)..(/數據)的(鍵)EncryptedPayloadContent的部分從(/鍵)

商務部,

要加密配置文件執行以下操作:

  • 取出PayloadContent陣列和序列化作爲一個適當的plist。
  • 請注意,此plist中的頂級對象是一個數組,而不是 字典。
  • CMS將序列化的plist加密爲封裝數據。 以DER格式序列化加密的數據。
  • 設置串行化的數據作爲 作爲配置文件中的數據的plist項的值,使用在plist中鍵 EncryptedPayloadContent
  • 由於頂層對象應當是數組

    passcode_payload_content_array = [passcode_payload_content] 
    

    序列化爲合適的plist

    to_be_encrypted_plist = passcode_payload_content_array.to_plist 
    

    加密證書有效內容conten噸,

    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)