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)
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?
Haben Sie jemals herausgefunden? Ich stehe vor demselben Problem. –