【问题标题】:Checking provisioning profile's developer certificate validity检查配置文件的开发人员证书有效性
【发布时间】:2012-07-17 11:48:14
【问题描述】:

我希望允许客户上传他们自己的配置文件,包括图标,这样我就可以让他们动态地制作我的应用的自定义版本,然后他们可以发布。

但是,我在验证配置文件时遇到了一点问题。特别是,我想检查 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

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

谢谢

【问题讨论】:

    标签: iphone ios openssl certificate ios-provisioning


    【解决方案1】:

    我一直在研究这个问题,结果证明它并不像大卫描述的那么难。解决方法其实很简单:

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

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

      base64 -d 证书 > 证书.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= 字段。

    【讨论】:

    • 至少在我安装的 OS X 10.7.4 上,/usr/bin/base64 需要 -D 而不是 -d 进行解码。这意味着完整的命令是cat certificate | base64 -D - | openssl x509 -inform DER -noout -text
    • 我是在 Linux 上执行此操作的,因此 Mac OS X 完全有可能使用不同的参数。感谢您的补充!
    【解决方案2】:

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

    ——技术——

    XML 文件中的证书...被读入一个 NSData 对象;虽然通常有 3 个证书;至少在 Apple 生成的配置文件中。不知道是不是这样。

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

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

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

    一个相对的快捷方式可能是调用 SecCertificateCopyValues() 来获取“授权密钥标识符 (2.5.29.35)”字段(该字段的字典键似乎是 kSecOIDAuthorityKeyIdentifier)并检查该字段的值是否为十六进制“E7342A2E22DE39606BB494CE7783612F31A07C35”这似乎适用于所有 Apple 颁发的证书。 SecCertificateCopyValues() 的返回是一个嵌套的字典字典,因此必须深入查找。

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

    【讨论】:

    • 谢谢大卫。不是我真正想要的(见我自己的答案),但仍然是一个很好的答案。既然不能给自己赏金,那我就奖励给你吧:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 2016-07-18
    相关资源
    最近更新 更多