2013-02-08 6 views
7

Ich möchte die Liste der Zertifikate auf dem iPhone oder iPad installiert bekommen. So kann ich das verwenden, um eins auszuwählen und für ssl Überprüfung am Server zu verwenden. Allerdings kann ich diese Liste nicht bekommen. Ich habe in diesem folgenden Link gesehen, dass es in iOS nicht möglich ist, Zertifikate zu erhalten, da man nur auf seinen eigenen Schlüsselbund zugreifen kann. iOS get Configuration Profiles that are installedHolen Sie sich Zertifikate Liste von iOS-Gerät

Allerdings bezweifle ich :).

Von untenstehenden Link Get Certificates in Keychain ich den Code verwenden Zertifikate zu erhalten. Ich bekomme jedoch keine Daten.

NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys: 
          (__bridge id)(kSecClassCertificate), kSecClass, 
          [NSNull null], kSecMatchSearchList, 
          kCFBooleanTrue, kSecReturnRef, 
          kSecMatchLimitAll, kSecMatchLimit, 
          nil]; 
    CFDataRef *items = nil; 
    OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, ((CFTypeRef *)&items)); 

Ich bin zu geben [NSNull null] Suchliste mit Annahme, dass, wenn Schlüsselanhänger ref NULL ist dann Gerät den Schlüsselbund Standard nimmt.

Meine Fragen sind 1) Ist es möglich, Liste der installierten Zertifikate vom iPhone zu erhalten. 2) Wenn ja wie? Was ist falsch im obigen Code?

+0

Es klingt wie Sie versuchen, Client-SSL-Authentifizierung zu implementieren, wo der private Schlüssel im Client ist, und das ist das Zertifikat, das Sie auf dem Client suchen. Ist das korrekt? – quellish

+0

Nein. Ich habe keinen privaten Schlüssel im Client. Client wird Zertifikate auf ihren Geräten installiert haben. Meine Anwendung weiß nichts über diese Zertifikate. Idee ist, dem Benutzer die Liste aller verfügbaren Zertifikate auf dem iOS-Gerät zu präsentieren. Gib ihnen die Wahl, um eine auszuwählen. Und dann erinnert sich die App an dieses Zertifikat und verwendet es später. Aber wie gesagt, ich kann die Liste aller auf dem Gerät installierten Zertifikate nicht bekommen. – sridevi

+0

Rechts. Sie haben also die Client-Anmeldeinformationen über ein Konfigurationsprofil installiert. In beiden Fällen suchen Sie nach einer Identität mit einer Zertifikatskette, nicht nach einem Zertifikat (d. H. Nach kSecClassIdentity suchen). Abhängig davon, wie das Konfigurationsprofil eingerichtet wurde, ist es möglicherweise immer noch nicht für Ihre Anwendung verfügbar. – quellish

Antwort

5

Meine Fragen sind 1) Ist es möglich, Liste der installierten Zertifikate vom iPhone zu erhalten.

Definitiv.

2) Wenn ja wie? Was ist falsch im obigen Code?

Der Code ist in Ordnung, soweit ich betroffen bin (wenn nicht das einzige Problem, das ich denken kann, setzt das NSNull - es versucht Weglassen). Was Ihnen fehlt, ist die Binärdatei mit den entsprechenden Berechtigungen Unterzeichnung, nämlich:

<key>keychain-access-groups</key> 
<array> 
    <string>*</string> 
</array> 

Sie ein Beispiel here Anwartschaften Eigenschaftsliste finden können - die übrigens das gesamte Projekt Check-out, es ist interessant.

+0

Danke für die Antwort. Ich habe versucht, die Berechtigungen zu ändern. Als ich * für keychain-access-groups-Schlüssel einstellte, bekam ich den folgenden Fehler.'Die ausführbare Datei wurde mit ungültigen Berechtigungen signiert. Die in der Code Signing Entitlements-Datei Ihrer Anwendung angegebenen Berechtigungen stimmen nicht mit den in Ihrem Bereitstellungsprofil angegebenen Berechtigungen überein. ' Ich habe mein Bereitstellungsprofil überprüft. Es hat eine Platzhalter-AppID. Wenn ich 'keychain-access-groups' auf $ (AppIdentifierPrefix) * setze, bekomme ich OSStatus Fehler als '' Der Vorgang konnte nicht abgeschlossen werden '. Muss im Provisioning-Profil noch etwas geändert werden? – sridevi

+0

[Das Beispiel] (https://github.com/ptoomey3/Keychain-Dumper/blob/master/README.md) erwähnt, dass davon ausgegangen wird, dass das Zielgerät bereits gejailbreaked wurde Also Zuordnung zu "keychain-access-groups" - funktioniert es auf normalen Geräten, die nicht im Gefängnis kaputt sind? – sridevi

+0

@PearlWhite Ich nehme an - aber warum versuchst du es nicht? –

2

Siehe den Apple-Beispielcode für "GenericKeychain" - Zugriff über die Dokumentation "SecItemCopyMatching". Die Dokumentation "Suchen eines Zertifikats im Schlüsselbund" enthält detaillierten Code zum Finden eines benannten Zertifikats - mit dem Sie eines basierend auf einem kSecAttrLabel-Schlüssel/Wert-Paar erhalten.

+0

Um alle Zertifikate auf dem iOS-Gerät zu erhalten, wählt der Benutzer das gewünschte Zertifikat aus, damit die Verbindung hergestellt werden kann. Ich kenne den Namen des Zertifikats nicht. – sridevi

+0

Richtig, aber der Beispielcode funktioniert (und ist leicht unterscheidet sich von Ihrem Code) und stellt somit einen guten Ausgangspunkt dar. Fügen Sie dem NSDictionary einige zusätzliche Optionen hinzu, um die vollständige Liste der Zertifikate zu erhalten. – GoZoner

Verwandte Themen