如何使用Ruby加密和签署iphone移动配置文件

我有一个由iphone配置实用程序生成的xml格式(模板)的unsigned mobileconfig文件。 我想使用openssl对其进行加密和签名,并能够使用Ruby on rails在iphone上安装它。 我不想创建一个SCEP服务器来执行此操作,因为我想继续动态修改此模板xml文件并使用某个URL提供它。

感谢您的帮助。

我已经检查了以下问题但是它不清楚如何加密可以在iphone上正确安装的文件 – 因为当我试图模仿加密文件格式时我不断得到“由于未知错误而无法安assembly置文件”来自iphone配置实用程序,只加密部件并适当地附加/添加配置文件的其他部分。

使用Ruby on Rails签署iPhone配置XML配置文件

apple的这本手册很有用,但它更适合创建SCEP服务器而不是用于操作模板mobileconfig文件 –

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

如果仍然有人在使用Ruby签署和加密配置文件时遇到问题,那么以下答案将非常有用。

我使用过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 } 

**

加密

**

通常对于正常的配置文件, passcode_payload_content作为字典数组进入passcode_payload['PayloadContent']

passcode_payload [‘PayloadContent’] = [passcode_payload_content]

但是对于加密的配置文件,应该删除PayloadContentPayloadContent应该根据配置文件密钥参考文档使用EncryptedPayloadContent

来自文档,

要加密配置文件,请执行以下操作:

  • 删除PayloadContent数组并将其序列化为适当的plist。
  • 请注意,此plist中的顶级对象是数组,而不是字典。
  • CMS将序列化的plist加密为封装数据。 以DER格式序列化加密数据。
  • 使用密钥EncryptedPayloadContent将序列化数据设置为配置文件中Data Pist项的值
  • 由于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) 

    将加密的有效载荷内容添加到原始有效载荷中

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

    **

    签名

    **

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

    最后,你可以使用

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

    发送有效载荷。

    您提到的链接仅涉及签署iPhone配置文件。 签署个人资料至少适合您吗?
    您可以使用openssl命令行实用程序validation代码生成的签名是否正确。 将生成的签名写入文件并使用以下命令validation签名并从pkcs#7签名中提取原始数据。

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