正在检查供应型材的开发者证书的有效期

问题描述:

我想允许客户上传他们自己的供应配置文件,包括图标,这样我就可以让他们我的应用程序在运行,他们可以再发布一个定制版本。正在检查供应型材的开发者证书的有效期

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

任何人都可以指出我在正确的方向吗?至关重要的是,我可以以某种方式验证开发人员证书的有效性。

感谢

+0

有没有人有想法? – Doa 2012-07-18 08:43:29

我一直在寻找到这一点,事实证明,它并没有成为硬如大卫如何描述它。解决方案其实很简单:

该证书是base64编码的DER证书。你需要做的是以下几点:

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

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

+2

至少在我的安装OS X 10.7.4中,'/ usr/bin/base64'预计'-D'而不是'-d '解码。这意味着完整的命令是'cat证书| base64 -D - | openssl x509 -inform DER -noout -text'。 – 2012-11-07 14:01:16

+0

我是从Linux开始的,因此Mac OS X使用不同的参数是完全可能的。感谢您的补充! – Doa 2012-11-26 16:41:29

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

- 技术---

该XML文件内的证书......读入一个NSData对象;尽管通常有3个证书;至少在Apple生成的配置文件中。不知道,如果是这样的话。

如果有3个证书它通常是足够的,以检查他们(通常是最后一个)中的一个被称为“苹果根CA”,有十六进制的“611E5B662C593A08FF58D14AE22452D198DF6C60”的SHA1值 - 我使用SHA1功能的OpenSSL。为此。

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

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

的相对快捷方式,然后可能会调用SecCertificateCopyValues()获得“权威密钥标识符(2.5.29.35)”字段(该辞典键似乎是kSecOIDAuthorityKeyIdentifier),并检查该字段的值是十六进制“E7342A2E22DE39606BB494CE7783612F31A07C35 “这似乎是所有苹果颁发的证书都是如此。来自SecCertificateCopyValues()的返回是一个嵌套的词典字典,因此必须深入查找才能找到它。

充分和完全的答案是与传递证书裁判SecTrustSettingsCopyTrustSettings(),接着,kSecTrustSettingsDomainUser,kSecTrustSettingsDomainAdmin,kSecTrustSettingsDomainSystem,检查是否证书被明确地值得信任。除非中间证书安装在机器上,否则如果它是证书,可能会失败。

+0

谢谢大卫。不是我正在寻找的东西(请参阅我自己的答案),但仍然是一个非常好的答案。由于我无法给予我自己的赏金,所以我会授予您:) – Doa 2012-07-23 12:47:10