2012-07-17 1 views
4

고객이 아이콘을 포함하여 자신의 프로비저닝 프로파일을 업로드 할 수 있도록하고 싶습니다. 따라서 고객이 내 앱의 사용자 정의 버전을 즉석에서 만들 수 있도록 게시 할 수 있습니다.프로비저닝 프로파일의 개발자 인증서 유효성 검사

그러나 프로비저닝 프로파일의 유효성을 검사하는 데 약간의 문제가 있습니다. 특히, 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

답변

6

저는 이것을 조사 해왔고, David이 설명하는 것만 큼 어렵지는 않습니다.이 솔루션은 실제로 매우 간단합니다.

인증서는 base64로 인코딩 된 DER 인증서입니다.

  • 는 XML
  • Base64로 디코딩 인증서에서 인증서를 추출 :

    base64로 -d 인증서> certificate.crt

  • 테스트는 당신이해야 할 것은 다음을하다 OpenSSL 인증서 :

    openssl x509 -inform DER- 인증서.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 certificate | base64 -D - | openssl x509 -info DER -noout -text'. –

+0

Linux에서이 작업을 수행 했으므로 Mac OS X에서 다른 매개 변수를 사용할 가능성이 있습니다. 추가 해줘서 고마워! – Doa

0

글쎄, 좋은 소식과 나쁜 소식이 있습니다. Mac/iOS의 보안 전문가 인 친구가 있는데,이 분야에서 많은 일을하고 있습니다. 그는 실제로 아주 비슷한 것을 가지고있었습니다. 그의 정보는 다음과 같습니다. 그러나 나쁜 소식은 명령 행 방법이 없다는 것입니다. 아래 기술을 사용하여 Mac 응용 프로그램을 돌릴 가능성이 높습니다.

- 기술 ---

이 XML 파일 내의 인증서 ...있는 NSData 객체로 읽어; 보통 3 개의 증명서가 있지만; 적어도 애플이 생성 한 프로파일에서. 그게 사실이라면 Dunno.

인증서가 3 개있는 경우 일반적으로 그 중 하나 (일반적으로 마지막 인증서)가 "Apple Root CA"이고 SHA1 값이 16 진수 "611E5B662C593A08FF58D14AE22452D198DF6C60"인지 확인하는 것으로 충분합니다. openssl에서 SHA1 기능을 사용합니다. 그걸로.

아마도 잎 인증서 일 인증서가 하나 뿐인 경우. 확인을 위해 확인을 위해 일반적으로 완전한 "신뢰 체인"이 필요하기 때문에 더 복잡합니다.

어떤 경우이든 Security.framework에 연결해야하며 SecCertificateRef를 얻기 위해 NSData (적절하게 캐스트)를 사용하여 SecCertificateCreateWithData()를 호출해야합니다.

상대 바로 가기 다음 SecCertificateCopyValues를 호출 할 수 있습니다()는 얻을 "기관 키 식별자 (2.5.29.35)는"필드 E7342A2E22DE39606BB494CE7783612F31A07C35 "(즉에 대한 사전 키를 kSecOIDAuthorityKeyIdentifier 것 같다)이 필드의 값을 16 진수가 있는지 확인 "이것은 모든 Apple 발행 인증서에 대해 사실 인 것으로 보입니다. SecCertificateCopyValues ​​()의 반환 값은 중첩 된 사전이므로 사전에 검색해야합니다.

완전하고 완전한 답변은 인증서가 명시 적으로 신뢰되지 않거나 어느 경우 확인, 연속적으로() kSecTrustSettingsDomainUser, kSecTrustSettingsDomainAdmin, kSecTrustSettingsDomainSystem을 SecTrustSettingsCopyTrustSettings에 인증서 심판을 통과하는 것입니다. 기계에 중간 인증서가 설치되어 있지 않으면 리프 인증서 인 경우 실패 할 수 있습니다.

+0

데이비드에게 감사드립니다. 내가 뭘 찾고 있었는지는 모르지만 (내 대답을 보라), 여전히 좋은 대답이다. 나 자신에게 현상금을 줄 수 없기 때문에, 나는 당신에게 그것을 수여 할 것이다 : – Doa