检查配置文件开发人员证书的有效性

时间:2012-07-17 11:48:15

标签: iphone ios openssl certificate ios-provisioning

我希望允许客户上传他们自己的配置文件,包括图标,以便我可以随时将它们设置为我的应用程序的自定义版本,然后可以发布。

但是,我在验证配置文件时遇到了一些麻烦。特别是,我想检查DeveloperCertificate是否真的是一个有效的证书。该配置文件看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ApplicationIdentifierPrefix</key>
    <array>
        <string>ABCDEFGH</string>
    </array>
    <key>CreationDate</key>
    <date>2012-03-28T11:17:23Z</date>
    <key>DeveloperCertificates</key>
    <array>
        <data>
        MIIFajCCBFKgAwIBAgIIddUra9YprMQwDQYJKoZIhvcNAQEFBQAwgZYxCzAJ
        BgNVBAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBs
        ZSBXb3JsZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBw
        ...     
        </data>
    </array>
    ...
</dict>

因此,我提取证书,然后想要检查它们,最好使用openssl命令。这些证书使用的加密是什么,如何使用openssl验证它们?我认为这会使用pkcs12,但尝试这会给我一个错误:

$ openssl pkcs12 -noout -in testcertificate
140653159306912:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1319:
140653159306912:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:381:Type=PKCS12

有人能指出我正确的方向吗?我必须以某种方式验证开发人员证书的有效性。

由于

2 个答案:

答案 0 :(得分:8)

我一直在研究这个问题,事实证明它并不像大卫描述它那么难。解决方案实际上非常简单:

证书是base64编码的DER证书。您需要做的是:

  • 从XML
  • 中提取证书
  • Base64-解码证书:

    base64 -d certificate&gt; certificate.crt

  • 使用OpenSSL测试证书:

    openssl x509 -inform DER -in certificate.crt -noout -text

或者,如果我们管它:

cat certificate | base64 -d - | openssl x509 -inform DER -noout -text

-text选项使openssl提供所有详细信息,但您可以根据自己的意愿进行指定。例如,假设您只对证书是否是实际的分发证书感兴趣,您可以使用-subject选项代替CN=字段。

答案 1 :(得分:0)

好吧,我有好消息和坏消息。我有一个朋友是Mac / iOS的安全专家,他在这方面做了很多工作。他实际上必须这么相似。我从他那里得到的信息如下。但坏消息是没有命令行方式 - 你很可能必须使用以下技术旋转Mac应用程序来做它。

- 技术---

该XML文件中的证书...被读入NSData对象;虽然通常有3个证书;至少在Apple生成的配置文件中。 Dunno,如果是这样的话。

如果有3个证书,通常就足以检查其中一个(通常是最后一个)被称为“Apple Root CA”并且SHA1值为hex“611E5B662C593A08FF58D14AE22452D198DF6C60” - 我在openssl.h中使用SHA1函数为此。

如果只有一个证书可能是叶证书。要检查是否正常,它会更复杂,因为您通常需要一个完整的“信任链”来进行验证。

在任何情况下,您都必须链接Security.framework,使用NSData(适当强制转换)调用SecCertificateCreateWithData()以获取SecCertificateRef。

然后,相对快捷方式可能是调用SecCertificateCopyValues()来获取“Authority Key Identifier(2.5.29.35)”字段(其字典键似乎是kSecOIDAuthorityKeyIdentifier)并检查该字段的值是否为十六进制“E7342A2E22DE39606BB494CE7783612F31A07C35”这似乎适用于所有Apple颁发的证书。 SecCertificateCopyValues()的返回是一个嵌套的字典词典,因此必须向下钻取才能找到它。

完整而完整的答案是将证书引用传递给SecTrustSettingsCopyTrustSettings(),依次使用kSecTrustSettingsDomainUser,kSecTrustSettingsDomainAdmin,kSecTrustSettingsDomainSystem,检查证书是否明确信任。除非在机器上安装了中间证书,否则如果它是叶子证书可能会失败。