正在检查供应型材的开发者证书的有效期
我想允许客户上传他们自己的供应配置文件,包括图标,这样我就可以让他们我的应用程序在运行,他们可以再发布一个定制版本。正在检查供应型材的开发者证书的有效期
但是,我在验证配置文件时遇到了一些麻烦。特别是,我想检查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
任何人都可以指出我在正确的方向吗?至关重要的是,我可以以某种方式验证开发人员证书的有效性。
感谢
我一直在寻找到这一点,事实证明,它并没有成为硬如大卫如何描述它。解决方案其实很简单:
该证书是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=
字段。
至少在我的安装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
我是从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,检查是否证书被明确地值得信任。除非中间证书安装在机器上,否则如果它是证书,可能会失败。
谢谢大卫。不是我正在寻找的东西(请参阅我自己的答案),但仍然是一个非常好的答案。由于我无法给予我自己的赏金,所以我会授予您:) – Doa 2012-07-23 12:47:10
有没有人有想法? – Doa 2012-07-18 08:43:29