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

时间:2011-08-17 02:43:25

标签: iphone ruby encryption configuration openssl

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

提前感谢您的帮助。

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

Signing iPhone Configuration XML Profile with Ruby on Rails

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

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

2 个答案:

答案 0 :(得分:2)

如果仍有人在使用Ruby签署和加密配置文件时遇到问题,请回答以下问题。

我使用了Ruby中的OpenSSL模块和Plist gem。

考虑密码限制配置文件。

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,并根据configuration profile key reference document使用EncryptedPayloadContent

来自doc,

  

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

  • 删除PayloadContent数组并将其序列化为正确的plist。
  •   
  • 请注意,此plist中的顶级对象是数组,而不是a   字典。
  • CMS将序列化plist加密为封装数据。   以DER格式序列化加密数据。
  • 将序列化数据设置为   使用键在配置文件中作为Data 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)
    

    将加密的有效内容添加到原始有效负载格式

    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" 
    

    发送有效载荷。

    答案 1 :(得分:-1)

      

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

         
        

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