如何使用 Ruby 对 iPhone 移动配置文件进行加密和签名

2023-12-07

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

提前感谢您的帮助。

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

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

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

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


如果仍然有人在使用 Ruby 签名和加密配置文件时遇到问题,以下答案会很有用。

我用过OpenSSLRuby 中提供的模块和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应按照配置文件关键参考文档.

从文档中,

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

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

    以 der 格式将加密的负载内容添加到原始负载中

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

    **

    Signing

    **

    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" 
    

    发送有效负载。

    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

    如何使用 Ruby 对 iPhone 移动配置文件进行加密和签名 的相关文章

    • 加密数据库字段的好方法?

      我被要求加密数据库中的各种数据库字段 问题是这些字段在读取后需要解密 我在用着Django and SQL Server 2005 有什么好主意吗 See 在 SQL Server 2005 数据库中使用对称加密 https web arc
    • NSString keepCount 是 2147483647 [重复]

      这个问题在这里已经有答案了 可能的重复 NSString 保留计数 https stackoverflow com questions 1390334 nsstring retain count Objective C NSString 属
    • iOS 相互认证

      我正在尝试在 IOS 5 中实现相互身份验证 但遇到了麻烦 NSUnderlyingError Error Domain kCFErrorDomainCFNetwork Code 1200 An SSL error has occurred
    • 通过 SO_RCVTIMEO 套接字选项在 Ruby 中设置套接字超时

      我试图通过 SO RCVTIMEO 套接字选项在 Ruby 中设置套接字超时 但它似乎对任何最近的 nix 操作系统都没有影响 使用 Ruby 的 Timeout 模块不是一个选择 因为它需要为每个超时生成和连接线程 这可能会变得昂贵 在需
    • 未知属性:user_id

      我在执行 current user stories build 期间收到错误未知属性 user id class User lt ActiveRecord Base has many stories class name Story for
    • RSpec 2 中使用 OR 相等

      下面这个例子的正确写法是什么 玩家的分数应等于 5 或 8 it should equal 5 or 8 do player score should 5 or 8 end Thanks Tim 5 or 8将始终产生结果 5 并且不会执行
    • 如何将图像放入此 UIPickerView 中?

      我不知道如何创建一个在文本一侧带有图像的自定义 UIPickerView 我一直在寻找一种方法 我刚刚发现了这个 UIView pickerView UIPickerView pickerView viewForRow NSInteger
    • 对范围值进行排序

      我想对表示数值范围的字符串数组进行排序 如下所示 b 0 5 100 250 5 25 50 100 250 500 25 50 使用sort我得到的方法 b sort gt 0 5 100 250 25 50 250 500 5 25 5
    • openssl_pkey_get_details($res) 不返回公共指数

      我在用着这个例子 https stackoverflow com a 12575951 2016196使用 php 生成的密钥进行 javascript 加密openssl图书馆 但是 details openssl pkey get de
    • 用于获取下周一(或一周中的任何一天)的日期的 Ruby 代码

      给定一个输入 例如 day Monday 我如何计算下一次的日期day def date of next day end require date def date of next day date Date parse day delta
    • 在 Yosemite 上安装 Ruby 1.9.2 时出错

      我在 Yosemite 上使用 rvm 安装 ruby 1 9 2 时遇到错误 有人可以帮助我吗 我更新了自制程序和rvm 我正在与其他人合作处理这个项目 所以我无法升级 ruby 我在下面放置了我的输出的链接 提前致谢 Kanyons M
    • 每 24 小时触发一次方法

      我正在尝试每天在给定时间触发一个方法 我尝试了一些方法 但我无法真正使其发挥作用 任何意见 将不胜感激 此外 如果无论应用程序是否打开它都会触发 那就更理想了 这可能吗 UI本地通知 http developer apple com lib
    • iPhone - UIImage imageWithData 返回 nil

      我需要从字节数组创建 UIImage 现在我创建了字节数组 image CGImageCreateWithImageInRect aux CGImage imageRect context CGBitmapContextCreate dat
    • UIView animateWithDuration:delay: 工作很奇怪

      我在使用 iPhone 动画块时遇到了一个奇怪的问题 这段代码 UIView animateWithDuration 2 delay 0 options 0 animations void controller setBackgroundC
    • 贴纸包会在模拟器上使 iMessage 崩溃,但在 iPhone 上不会崩溃

      按照 Apple 的在线说明和视频在 Xcode 中创建了一个贴纸包 所有图像的尺寸均正确且远低于文件大小阈值 如果我在我的实体 iPhone 上构建并运行贴纸包 一切都会完美运行 如果我在模拟器上构建并运行贴纸包 对于任何模拟的 iPho
    • 如何向标准 UIButton 添加徽章? [关闭]

      Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以在标准中添加看起来标准的徽章UIButton 如果不支持半原生 那么实现此目的最简单的方法是什么 示例图片 这是 Sascha
    • 为什么是 javascript:history.go(-1);无法在移动设备上工作?

      首先 一些背景 我有一个向用户呈现搜索页面 html 表单 的应用程序 填写标准并单击 搜索 按钮后 结果将显示在标准部分下方 在结果列表中 您可以通过单击将您带到新页面的链接来查看单个结果的详细信息 在详细信息页面中 我添加了一个 返回结
    • UITableViewCell显示多种字体

      我想在 uitableviewcell 中以类似于 iPhone 地址簿的不同字体显示两个单词 例如 约翰Buchanan 您应该使用两个 UILable 或者您可以使用OH属性标签 https github com AliSoftware
    • ArgumentError:Ruby 中的参数数量错误

      试图解决这个问题 class Person def initialize name name name end def greet other name puts Hi other name my name is name end end
    • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

      我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如

    随机推荐