我有一个由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文件 -
答案 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