【问题标题】:how to encrypt and sign iphone mobile configuration file using Ruby如何使用 Ruby 加密和签署 iphone 移动配置文件
【发布时间】:2011-08-17 02:43:25
【问题描述】:

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

提前感谢您的帮助。

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

Signing iPhone Configuration XML Profile with Ruby on Rails

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

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

【问题讨论】:

  • 你说的是越狱相关的事情吗?
  • 否 - 我希望它适用于未越狱的 iphone。
  • 我听到了!我目前正在为完全相同的事情苦苦挣扎——签署配置文件完美无缺,但加密配置文件只会获得错误“未安装此配置文件的解密密钥”。如果我找到一个答案,我会在这里添加一个答案。不过我可以给出一个提示:如果您安装 iPhone 配置实用程序并通过 USB 电缆连接您的设备,您可以在控制台选项卡中看到其他错误消息(例如上面的错误消息)。这可能会有所帮助。
  • 一封电子邮件提醒我,如果我解决了这个问题,我答应在这里更新。我做到了,但不是在 Ruby 中。请参阅github.com/Calrion/Melange/tree/master/profilesign 上的 bash 脚本(需要 PlistBuddy,因此仅限 OS X,抱歉)。

标签: iphone ruby encryption configuration openssl


【解决方案1】:

如果仍然有人在使用 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 应该被删除,EncryptedPayloadContent 应该按照configuration profile key reference document 使用。

来自文档,

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

  • 删除 PayloadContent 数组并将其序列化为适当的 plist。
  • 请注意,此 plist 中的顶级对象是一个数组,而不是 字典。
  • CMS 将序列化的 plist 加密为封装数据。 序列化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)
    

    将加密的payload内容添加到der格式的原始payload中

    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" 
    

    发送有效载荷。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-22
        • 2015-04-23
        • 1970-01-01
        • 2012-06-18
        • 1970-01-01
        • 2017-02-03
        • 2010-09-29
        • 2010-10-08
        相关资源
        最近更新 更多