5

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

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

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

谢谢

4

2 回答 2

8

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

该证书是 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=字段。

于 2012-07-23T12:44:55.077 回答
-1

好吧,我有好消息和坏消息。我有一个朋友是 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() 的返回是一个嵌套的字典字典,因此必须深入查找它。

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

于 2012-07-19T21:23:36.703 回答