2017-07-25 122 views
0

我有一个可可项目,构建了一个MacOS应用程序。我不会将它分发到Apple商店。在MacOS上使用swift 3在登录钥匙串中安装证书

我应该在Swift 3中使用什么来在登录钥匙串中安装证书,以便始终信任,就像这个命令一样?

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

我已经创建了我的ca-cert.cer和ca-cert.pem。

我知道的授权API和我的苹果文档中看到这个方法https://developer.apple.com/documentation/security/1401659-secitemadd 和这个文档https://developer.apple.com/documentation/security/certificate_key_and_trust_services/certificates/storing_a_certificate_in_the_keychain

首先创建我的质子交换膜的DER版本

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

然后将下面的代码在登录钥匙串中成功安装证书,但不会被信任。

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)") 
    } 

我应该改变它以便始终可信吗?

回答

1

在目标c中,您需要执行以下步骤。

//您的证书已经被使用SecItemAdd

SecCertificateRef certificate; //use SecCertificateCreateWithData to get it. 

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

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

请注意,我用手工键入此,因此通过检查自己的错误类型安装在login.keychain。

我已经自己测试过了,所以您需要做的是将其更改为swift代码。

相关问题