2016-06-30 3 views
1

Ich greife auf den https Webserver mit Zertifikatsauthentifizierung von Mac App, so muss ich Authentifizierung behandeln und mein Zertifikat (URLSession -> NSURLAuthenticationMethodClientCertificate -> Rufen Sie SecPKCS12Import auf und extrahieren Sie die Identität aus dem importierten Zertifikat -> erstellen Sie NSURLCredential from identity und stellen Sie es dem Server in completionHandler zur Verfügung. willImportieren p12 Zertifikat mit vollem Zugriff auf den privaten Schlüssel für meine Anwendung (OS X)

enter image description here

ich diese Meldung vermeiden:

Aber nach jedem https das Dialogfeld anfordern „MYAPP will unterschreiben mit‚ist privateKey‘in Ihrem Schlüsselbund“ angezeigt. Meine App ist korrekt signiert. Ich glaube, ich brauche den Zugang für das Zertifikat festzulegen, während (Vollzugriff für meine app) zu importieren, ich versuche es mit SecAccessCreate und SecPKCS12Import Optionen zu tun:

func extractIdentity(certData:NSData, certPassword:String) -> IdentityAndTrust { 

     var identityAndTrust:IdentityAndTrust! 
     var securityError:OSStatus = errSecSuccess 

     var items:CFArray? 
     //let certOptions:CFDictionary = [ kSecImportExportPassphrase.takeRetainedValue() as String: certPassword ]; 

     let index: CFIndex = 2 

     let passwordKey = kSecImportExportPassphrase as String; 
     let passwordValue: CFString = "PASSWORD"; 

     let accessKey = kSecImportExportAccess as String; 
     var access:SecAccessRef? = nil; 
     SecAccessCreate("CERTIFICATE_NAME", nil, &access); 

     var keys = [unsafeAddressOf(accessKey), unsafeAddressOf(passwordKey)] 
     var values = [unsafeAddressOf(access!), unsafeAddressOf(passwordValue)] 

     var keyCallbacks = kCFTypeDictionaryKeyCallBacks 
     var valueCallbacks = kCFTypeDictionaryValueCallBacks 

     let options = CFDictionaryCreate(kCFAllocatorDefault, &keys, &values, index, &keyCallbacks, &valueCallbacks) 

     // import certificate to read its entries 
     securityError = SecPKCS12Import(certData, options, &items); 

     if securityError == errSecSuccess { 

      let certItems:CFArray = items as CFArray!; 
      let certItemsArray:Array = certItems as Array 
      let dict:AnyObject? = certItemsArray.first; 

      if let certEntry:Dictionary = dict as? Dictionary<String, AnyObject> { 

       // grab the identity 
       let identityPointer:AnyObject? = certEntry["identity"]; 
       let secIdentityRef:SecIdentityRef = identityPointer as! SecIdentityRef!; 

       // grab the trust 
       let trustPointer:AnyObject? = certEntry["trust"]; 
       let trustRef:SecTrustRef = trustPointer as! SecTrustRef; 

       // grab the certificate chain 
       var certRef:SecCertificate? 
       SecIdentityCopyCertificate(secIdentityRef, &certRef); 
       let certArray:NSMutableArray = NSMutableArray(); 
       certArray.addObject(certRef as SecCertificateRef!); 

       identityAndTrust = IdentityAndTrust(identityRef: secIdentityRef, trust: trustRef, certArray: certArray); 
      } 
     } 

     return identityAndTrust; 
    } 

Auf jeden Fall ist es nicht funktioniert. Wie kann ich dieses Dialogfeld vermeiden?

Dieser Thread How do I add authorizations to code sign an app from new keychain without any human interaction bezieht sich auf den Import des Zertifikats mit "Sicherheit" -Befehl, und Vorschlag war die Verwendung von -A oder -T Flags beim Importieren des Zertifikats, aber kann ich es programmgesteuert ohne Konsolenbefehle tun?

+0

Haben Sie jemals herausgefunden? Ich stehe vor demselben Problem. –

Antwort

1

Wahrscheinlich erstellen und führen Sie die Anwendung mehrere Male aus. Dies bedeutet, dass das Zertifikat dem Schlüsselbund beim ersten Mal hinzugefügt wurde und die ausführbare Datei den privaten Schlüssel verwenden darf. Wenn Sie jedoch einige Änderungen vorgenommen und das Projekt neu erstellt haben, wurde die ausführbare Datei ersetzt und die neue ausführbare Datei hat keinen Zugriff auf den privaten Schlüssel (dies ist auch ein Problem, wenn Ihre Benutzer die Software aktualisieren oder aus irgendeinem Grund neu installieren müssen).

Was ich fand, musste ich das Zertifikat aus dem Schlüsselbund entfernen, nachdem ich es verwendet habe, und es vor jeder Verwendung neu hinzufügen. Wie auch immer, ich habe gelesen, dass Sie einer App-ID die Berechtigung erteilen können, damit dies auch in Ihrem Fall funktioniert.

Ich habe einen Code-Beispiel in Antwort auf meine Frage ist: How do I kill the popup?

Verwandte Themen