如何使用 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 移动配置文件进行加密和签名 的相关文章

    • 如何查找哪个注释发送了showDetails?

      如何查找哪个注释发送了showDetails MKPinAnnotationView customPinView MKPinAnnotationView alloc initWithAnnotation annotation reuseId
    • 如何在 Monotouch 中对 UIImageView 进行运动模糊效果?

      在 MonoTouch 中进行实时运动模糊的方法是什么 当滚动惯性图片库时 我需要在 UIImageView 上应用运动模糊效果 以强度和方向作为参数 就像在 Photoshop 中一样 我在 CocoaTouch 或 CoreAnimat
    • 有没有一种好方法来计算 ruby​​ 中范围元素的总和

      计算范围总和的好方法是什么 Input 4 10 Output 4 5 6 7 8 9 10 49 您可以使用EnumerableRange 对象上的方法 在本例中使用Enumerable inject 4 10 inject gt 49
    • ruby 1.9.1 的 gem install mongrel 失败

      昨天我开始了 Rails 开发 我安装了 ruby 1 9 1 rubygems 和 Rails 跑步gem install mongrel工作得很好 表面上也安装了杂种 我有点困惑 因为 script server 默认启动 webric
    • PHP 5 的 SQLite 编译设置是什么?

      SQLite 3 7 附带了新的预写日志记录 WAL http www sqlite org wal html并且有很多设置可以被配置 http www sqlite org compile html 但是 似乎没有任何方法可以改变任何事情
    • CryptoJS 和 Pycrypto 一起工作

      我正在使用 CryptoJS v 2 3 加密 Web 应用程序中的字符串 并且需要在服务器上使用 Python 对其进行解密 因此我使用 PyCrypto 我觉得我错过了一些东西 因为我无法让它工作 这是JS Crypto AES enc
    • 为什么单个 Vec4 乘法会大大减慢我的 ogl es 2 片段着色器的速度?

      我正在为 iOS 设备编写 2D OpenGL 游戏 现在 我正在研究 iPad 第一代 上的性能 该游戏有 ogl 1 1 和 2 0 的代码路径 我可以通过 define 使用 ogl 2 0 时 分析器告诉我 我的渲染器利用率 相当稳
    • iOS Swift 检测键盘事件

      我能以某种方式检测来自 iOS 键盘的事件吗 我想检测此类事件UIViewController哪个没有UITextField或任何此类物体 我只有四个圆圈UIView我想在按下键盘上的按钮时将它们涂成不同的颜色 您没有任何对象可以从键盘获取
    • SIGHUP 用于重新加载配置

      根据signal 7 SIGHUP用于检测控制终端的挂起或控制进程的死亡 然而 我遇到过很多 OSS 守护进程 服务 其中SIGHUP用于启动配置的重新加载 这里有一些例子 hostapd sshd snort etc 这是实现重新加载的标
    • 如何等待 webViewDidFinishLoad 完成

      我有一个初始化 webView 的布尔条件 并在 webViewDidFinishLoad 中加载另一个委托 以便在完成完成后触发 但是 由于布尔值在条件 webViewDidFinishLoad 之前返回 因此页面永远不会完全加载 如何确
    • 如何从 Ruby 模块中仅导入几个函数?

      假设我有一个带有以下方法的模块 function1 function2 function3 我想导入 function1 和 function2 但不导入 function3 有没有办法在红宝石中做到这一点 不确定是否有一种干净的方法来添加
    • 如何在 Ruby 中使用 Safari 技术预览设置 Capybara

      我无法使用 Capybara 和 Selenium 与 Safari 技术预览版 STP 建立会话 Capybara 甚至不会打开浏览器窗口 我已升级到 Ruby 2 3 0 Capybara 2 14 2 Selenium 3 4 0我从
    • Rails validates_与模型的错误消息相关

      我在模型中使用 validates linked 来使用其他模型的验证代码 问题是验证失败的消息是 is invalid 我想将模型验证失败的实际描述错误冒泡到顶部 我发现这个问题 验证与模型的错误消息关联 https stackoverf
    • 这个结果背后的逻辑是什么?

      def foo override end p foo bye bye p foo hello world Output override hello 我可以理解如果结果是 override world or even bye bye hel
    • 如何使用 ZBar 读取器的 scanCrop 属性?

      我正在使用 iPhone 的 ZBar SDK 来扫描条形码 我希望阅读器仅扫描特定的矩形而不是整个视图 为此需要将阅读器的 scanCrop 属性设置为所需的矩形 我很难理解必须设置的矩形参数 有人可以告诉我如果在纵向视图上它的坐标是 我
    • 从 Core Data、iOS 获取最后插入的项目

      有没有办法获取核心数据数据库中最后插入的项目 这将返回最后插入的对象 setFetchLimit 1 和 setFetchOffset 所有条目数 1
    • Rails 应用程序在模型间保存方面遇到问题

      我正在开发一个从网站下载元标签并然后保存的应用程序 下载发生在一个名为Site 我想将下载的机器人元标签保存到一个名为的模型中robots tag它通过一个名为的连接表连接到站点meta tag sites 但是我在站点模型中编写的用于执行
    • 如何添加授权以从新钥匙串对应用程序进行代码签名,而无需任何人工交互

      我正在尝试使用特定证书自动化构建 iPhone 应用程序的过程 因此 想象一下 如果不同的用户将他们的证书上传到系统中 并且可以立即用于代码签名 我想在没有任何交互的情况下做到这一点 我也不想用不同的用户证书弄乱系统或登录钥匙串 为此我有
    • 如何在ios中以编程方式添加水平间距和垂直间距?

      我在 ios 8 中创建了一个应用程序 因为我有 4 个可垂直使用的标签 它应该在某些条件下更改位置 所以我已禁用自动布局并以编程方式设置约束 现在的问题是 我可以设置水平和垂直位置 宽度和高度的约束 但我找不到任何方法来添加标签之间的水平
    • 增加 NSData 的长度

      基本上 我有一个 46 个字符的 NSString 我将其转换为 NSData 我需要将字符串填充到 48 个字符 仅在 NSString 末尾添加 是行不通的 所以 我只是使用以下方法增加了 NSData 的长度 NSString str

    随机推荐