繁体   English   中英

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

[英]how to encrypt and sign iphone mobile configuration file using Ruby

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

提前感谢您的帮助。

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

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

苹果的这本手册很有用,但它更适合创建 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]

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

从文档中,

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

  • 删除PayloadContent数组并将其序列化为适当的 plist。
  • 请注意,此 plist 中的顶级 object 是一个数组,而不是字典。
  • CMS 将序列化的 plist 加密为封装数据。 以 DER 格式序列化加密数据。
  • 使用密钥EncryptedPayloadContent将序列化数据设置为配置文件中的 Data plist 项的值
  • 由于 plist 中的顶级 object 应该是一个数组

    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" 
    

    发送有效载荷。

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

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

    暂无
    暂无

    声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM