Apple MDM - 无法解密配置文件(未安装此配置文件的解密密钥)

时间:2014-07-08 10:49:07

标签: ios ruby encryption openssl mdm

我正在使用Apple OTA Profile Delivery示例(在Ruby中)在C ++中实现Apple MDM Profile Service。除了最后一步(配置应用)之外,似乎所有事情都运行良好。

IPhone配置实用程序显示以下内容:

  

Jul 8 16:38:48 iPhone profiled [1454] :(注释)profiled:服务开始......

     

Jul 8 16:38:48 iPhone profiled [1454] :(注)MC:检查MDM安装......

     

Jul 8 16:38:48 iPhone profiled [1454] :(注)MC:...已完成MDM安装检查。

     

Jul 8 16:38:50 iPhone profiled [1454] :(注)MC:注册OTA个人资料服务......

     

Jul 8 16:38:51 iPhone profiled [1454] :(注)MC:试图检索已颁发的证书......

     

Jul 8 16:38:51 iPhone profiled [1454] :(注)MC:已收到已颁发的证书。

     

Jul 8 16:38:52 iPhone profiled [1454] :(注)MC:从OTA Profile服务中检索个人资料......

     

Jul 8 16:38:52 iPhone profiled [1454] :(错误)MC:解密失败:NSError:

     

说明:无法解密配置文件

     

Sugg:未安装此配置文件的解密密钥。

     

美国说明:无法解密个人资料

     

US Sugg:未安装此配置文件的解密密钥。

     

域:MCProfileErrorDomain

     

代码:1006

     

输入:MCFatalError

这似乎是一个常见的错误,因为我在discussion.apple.com上找到了几个讨论,但他们没有解决方案。我也在这里找到了a comment,但它也没有解决方案。

Over-the-Air Profile Delivery Concepts中的Apple Ruby示例效果很好。我比较了我的C ++实现和Ruby示例的输出(证书转储)。它们是相同的,除了域名(我使用&#34; TEST&#34;而不是&#34; ACME&#34;。我试图使用原始证书,但它们在我的实现中也不起作用。)。< / p>

我在代码中使用相同的加密方法将新证书发送到设备端。它有效。

在配置文件加密的情况下,我使用从设备端接收的PKCS7的证书。所以我认为问题不是因为OpenSSL的使用不正确。

你能告诉我什么吗?

UPDATE1:

1)实际上,当我说证书(我和示例)是相同的时,我的意思是他们有相同的依赖关系,我的意思是看起来我和示例算法的工作方式类似。肯定证书有不同的指纹等。

2)我使用了来自Over-the-Air Profile Delivery链接的Ruby示例中的确切算法。据我所知,我使用的是SCEP。

这是我的C ++代码(我主要删除了用于记录的代码)。是的,我理解我的代码很粗糙,但在这个阶段我只需要一个有效的算法。

C-X509-请求从 - device.pem

PKCS #10 Certificate Request (Version 1.0)
Subject: CN=Profile Service (4feea0ef-b586-4c54-a767-5d8160a04952), O=TEST Inc.
Public Key: X.509 format RSA key

Extension Request:

#1: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
   DigitalSignature
   Key_Encipherment
]

E-PKCS7-degenerated.pem

Owner: CN=Profile Service (4feea0ef-b586-4c54-a767-5d8160a04952), O=TEST Inc.
Issuer: CN=TEST Root CA (314aa3fe-ea1f-4afb-b2f5-ad998f1eddf3), O=None
Serial number: 145
Valid from: Wed Jul 09 22:38:04 NOVT 2014 until: Thu Jul 10 22:38:04 NOVT 2014
Certificate fingerprints:
     MD5:  B4:F4:78:E3:A1:69:FB:23:49:E8:0D:4C:E5:8F:C5:A6
     SHA1: 47:19:8A:9C:9F:91:B2:FC:6B:ED:EE:A8:41:FF:3B:CF:6A:1D:52:F2
     SHA256: 59:95:31:66:B8:D8:54:83:B5:23:17:86:1A:7F:94:98:B2:17:58:61:F8:
      0A:4C:E8:B0:1C:4D:79:23:B0:32:93
     Signature algorithm name: SHA1withRSA
     Version: 3

 Extensions:

 #1: ObjectId: 2.5.29.15 Criticality=true
 KeyUsage [
   DigitalSignature
   Key_Encipherment
 ]

/个人资料(第二个POST;我对它的回复导致&#34;个人资料无法解密&#34;错误)

PKCS7Wrap pkcs7;
pkcs7.InitFromDER(httpData.block_, httpData.blockSize_);

std::string content;

// ...........

SavePKCS7ToFile(pkcs7.pkcs7_, "K-pkcs7-from-device-2.pem");

std::string tmp = appleMDMPList_.GetClientCertConfPayloadPList("foo");

SaveData(tmp, "3-client-cert-conf.xml");

PKCS7Wrap encryptedContent;
PKCS7Wrap::EncryptData(pkcs7.GetCertificates(), tmp, encryptedContent);

if (encryptedContent.IsInited())
{
    SavePKCS7ToFile(encryptedContent.pkcs7_, "Q-encrypted_profile.pem");

    content =
        appleMDMPList_.GetConfigurationPayloadPList(encryptedContent.ToDER());

    SaveData(content, "4-configuration.xml");
}

std::string signedProfile;
PKCS7Wrap::SignData(keyStore.GetAppleMDMSSLCrt(),
    keyStore.GetAppleMDMSSLKey(), content, signedProfile);  

// send to the device with mime = application/x-apple-aspen-config

K-PKCS7-从器件用2.pem

Certificate[1]:
Owner: CN=Profile Service (4feea0ef-b586-4c54-a767-5d8160a04952), O=TEST Inc.
Issuer: CN=TEST Root CA (314aa3fe-ea1f-4afb-b2f5-ad998f1eddf3), O=None
Serial number: 145
Valid from: Wed Jul 09 22:38:04 NOVT 2014 until: Thu Jul 10 22:38:04 NOVT 2014
Certificate fingerprints:
     MD5:  B4:F4:78:E3:A1:69:FB:23:49:E8:0D:4C:E5:8F:C5:A6
     SHA1: 47:19:8A:9C:9F:91:B2:FC:6B:ED:EE:A8:41:FF:3B:CF:6A:1D:52:F2
     SHA256: 59:95:31:66:B8:D8:54:83:B5:23:17:86:1A:7F:94:98:B2:17:58:61:F8:
0A:4C:E8:B0:1C:4D:79:23:B0:32:93
     Signature algorithm name: SHA1withRSA
     Version: 3

Extensions:

#1: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
   DigitalSignature
   Key_Encipherment
]


Certificate[2]:
Owner: CN=TEST Root CA (314aa3fe-ea1f-4afb-b2f5-ad998f1eddf3), O=None
Issuer: CN=TEST Root CA (314aa3fe-ea1f-4afb-b2f5-ad998f1eddf3), O=None
Serial number: 1
Valid from: Mon Jul 07 19:28:55 NOVT 2014 until: Tue Jul 07 19:28:55 NOVT 2015
Certificate fingerprints:
     MD5:  78:20:18:80:9C:09:D9:DA:36:3E:06:CC:F7:61:A9:13
     SHA1: 40:61:EA:90:D8:58:20:3C:43:CB:2B:E1:3F:49:DF:A8:5A:7A:01:39
     SHA256: AB:F6:5C:A7:23:F1:92:38:12:71:29:2A:C0:F1:04:69:CF:F4:7C:26:FC:
E7:0C:89:B4:10:A4:E5:58:9F:50:39
     Signature algorithm name: SHA1withRSA
     Version: 3

Extensions:

#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
   CA:true
  PathLen:2147483647
]

#2: ObjectId: 2.5.29.15 Criticality=true
 KeyUsage [
    DigitalSignature
   Key_CertSign
  Crl_Sign

UPDATE2:

我刚刚重新生成了证书(CA,RA,SSL)并且可以正常运行。我不知道为什么:)

2 个答案:

答案 0 :(得分:0)

@jww是对的。没有任何代码就无法解决此类问题。

我的猜测是您使用错误的证书加密配置文件。

  

我比较了我的C ++实现和Ruby示例的输出(证书转储)。 &gt;除了域名之外,它们是相同的(我使用&#34; TEST&#34;而不是&#34; ACME&#34;。

坦率地说。这句话在我的心中引起了红旗。应该有不止域名的区别。应该有公钥差异,序列号差异等。

最有可能的情况是,您将一个证书发送到设备并使用另一个证书来加密配置文件。

顺便说一句。您是否使用PKCS12或SCEP为您的设备提供身份?

答案 1 :(得分:0)

我知道这是一个旧帖子,但我昨天碰到了同样的事情,这对加密的有效载荷的格式化造成了问题,即未安装此配置文件的&#34;解密密钥& #34;错误信息是红鲱鱼。

加密的有效负载有一个&#34;数组&#34; &#34; dict&#34;,与未加密的有效载荷不同。这在Apple提供的测试Ruby脚本中很明显。在示例Ruby脚本中,PKCS7.encrypt调用会加密client_cert_configuration_payload的输出。该函数发出一系列有效负载,如下所示:Plist :: Emit.dump([webclip_payload,client_cert_payload])。在/ enroll处理程序中签名的内容只是一个&#34; dict&#34;,Plist :: Emit.dump(payload)。

通过更改错误指示无法解密的内容来修复未安装的密钥是非常令人惊讶的。