2017-07-25 1 views
0

J'ai un projet de cacao, la construction d'une application MacOS. Je ne vais pas le distribuer sur Apple Store. Que dois-je utiliser dans Swift 3 pour installer un certificat dans le trousseau de connexion, pour être toujours approuvé, comme le fait cette commande?Installer le certificat dans le trousseau de connexion avec swift 3 sur MacOS

security add-trusted-cert -k ~/Library/Keychains/login.keychain-db ca-cert.cer 

J'ai déjà mes fichiers ca-cert.cer et ca-cert.pem créés.

Je sais sur l'API d'autorisation et j'ai vu dans la documentation d'Apple cette méthode https://developer.apple.com/documentation/security/1401659-secitemadd et ce doc https://developer.apple.com/documentation/security/certificate_key_and_trust_services/certificates/storing_a_certificate_in_the_keychain

D'abord, je crée une version der de mon pem avec

openssl x509 -outform der -in ~/ca-cert.pem -out ~/ca-cert.der 

Ensuite, le code suivant installer correctement le certificat dans le trousseau de connexion, mais ne sera pas approuvé.

do { 
     let cerData = NSData(contentsOfFile: homeDirURL.path + "/ca-cert.der") 
     let certificate: SecCertificate? = SecCertificateCreateWithData(nil, cerData as! CFData) 
     let addquery: [String: Any] = [kSecClass as String: kSecClassCertificate, 
             kSecValueRef as String: certificate, 
             kSecAttrLabel as String: "My Certificate"] 
     let status = SecItemAdd(addquery as CFDictionary, nil) 
     guard status == errSecSuccess else { 
      print("error \(status) : " + (SecCopyErrorMessageString(status, nil) as! String)) 
      return 
     } 

    } 
    catch let error as NSError { 
     print("Ooops! Something went wrong: \(error)") 
    } 

Que dois-je changer pour qu'il soit toujours fiable?

Répondre

1

Dans l'objectif c, vous devez effectuer les étapes suivantes.

// Votre certificat a déjà été installé dans login.keychain en utilisant SecItemAdd

SecCertificateRef certificate; //use SecCertificateCreateWithData to get it. 

NSDictionary *newTrustSettings = @{(id)kSecTrustSettingResult:[NSNumber numberWithInt:kSecTrustSettingsResultTrustRoot]}; 

SecTrustSettingsSetTrustSettings(certificate, kSecTrustSettingDomainUser, (__bridget CFTypeRef)newTrustSettings)); 

Notez que je tape ceci à la main, afin de vérifier les erreurs de type par vous-même.

Je l'ai testé par moi-même, ce que vous devez faire est de le changer en code rapide.