为macOS在Swift 5.x中设置证书信任

为macOS在Swift 5.x中设置证书信任,macos,swift5,Macos,Swift5,我一直在试图了解如何使用Swift 5在macOS中处理证书信任。我可以使用命令行添加CA证书,但我希望为正在开发的应用程序使用代码,而不是依赖外部脚本和进程() 这是我的代码,但我不明白应该在函数SecTrustSettingsSetTrustSettings中传递什么值 func addCert(cert: String) { let certURL = Bundle.main.url(forResource: cert, withExtension: "cer")! let

我一直在试图了解如何使用Swift 5在macOS中处理证书信任。我可以使用命令行添加CA证书,但我希望为正在开发的应用程序使用代码,而不是依赖外部脚本和进程()

这是我的代码,但我不明白应该在函数SecTrustSettingsSetTrustSettings中传递什么值

func addCert(cert: String) {
    let certURL = Bundle.main.url(forResource: cert, withExtension: "cer")!
    let certData = try! Data(contentsOf: certURL)
    let certificate: SecCertificate? = SecCertificateCreateWithData(nil, certData as CFData)
    let addquery: [String: Any] = [kSecClass as String: kSecClassCertificate,
                                   kSecValueRef as String: certificate!,
                                   kSecAttrLabel as String: cert]
    let status = SecItemAdd(addquery as CFDictionary, nil)
    guard status == errSecSuccess else {
        print("error \(status) : " + (SecCopyErrorMessageString(status, nil)! as String))
        return
    }
    SecTrustSettingsSetTrustSettings(certificate!, .user, <trustSettingsDictOrArray: CFTypeRef>)
}
func addCert(证书:字符串){
让certURL=Bundle.main.url(对于资源:cert,扩展名为:“cer”)!
让certData=try!Data(contentsOf:certURL)
let certificate:SecCertificate?=SecCertificateCreateWithData(无,certData作为CFData)
let addquery:[String:Any]=[kSecClass as String:kSecClassCertificate,
kSecValueRef作为字符串:证书!,
kSecAttrLabel作为字符串:cert]
let status=SecItemAdd(addquery作为CFDictionary,nil)
防护状态==errSecSuccess-else{
打印(“错误\(状态):”+(SecCopyErrorMessageString(状态,无)!作为字符串))
返回
}
SecTrustSettingsSetTrustSettings(证书!,.user,)
}
我通读了文档,看到了什么“可能”的值可以使用,比如trustAsRoot,但不知道如何添加这些值以使函数工作。关于在Swift for macOS上使用此工具的资料不多,如有任何帮助,我们将不胜感激


我的最终目标是向用户login.keychain-db添加CA证书,以允许访问我工作的Sharepoint门户。我希望在用户单击按钮调用此函数时添加并自动信任这些函数。谢谢。

因此,通过使用名为Swiftify的扩展,并将旧的objective-c代码转换为swift,我能够找到我需要做的事情。这使得快速实施对我的问题更加容易理解。这是应用商店的免费扩展,我衷心感谢。下面是允许我以编程方式安装和信任证书的最后一段代码

func addCert(cert: String) {
    let certURL = Bundle.main.url(forResource: cert, withExtension: "cer")!
    let certData = try! Data(contentsOf: certURL)
    let certificate: SecCertificate? = SecCertificateCreateWithData(nil, certData as CFData)
    let addquery: [String: Any] = [kSecClass as String: kSecClassCertificate,
                                   kSecValueRef as String: certificate!,
                                   kSecAttrLabel as String: cert]
    let status = SecItemAdd(addquery as CFDictionary, nil)
    guard status == errSecSuccess else {
        print("error \(status) : " + (SecCopyErrorMessageString(status, nil)! as String))
        return
    }

    let result = SecTrustSettingsSetTrustSettings(certificate!, .user, [kSecTrustSettingsResult: NSNumber(value: SecTrustSettingsResult.trustAsRoot.rawValue)] as CFTypeRef)
    print("result = \(result) : " + (SecCopyErrorMessageString(result, nil)! as String))
}
我希望这能帮助一个贫穷的灵魂在未来解决这些问题。如果您计划导入大量证书,我建议您考虑创建一个帮助工具来处理权限提升,否则用户必须为每个证书输入密码

func addCert(cert: String) {
    let certURL = Bundle.main.url(forResource: cert, withExtension: "cer")!
    let certData = try! Data(contentsOf: certURL)
    let certificate: SecCertificate? = SecCertificateCreateWithData(nil, certData as CFData)
    let addquery: [String: Any] = [kSecClass as String: kSecClassCertificate,
                                   kSecValueRef as String: certificate!,
                                   kSecAttrLabel as String: cert]
    let status = SecItemAdd(addquery as CFDictionary, nil)
    guard status == errSecSuccess else {
        print("error \(status) : " + (SecCopyErrorMessageString(status, nil)! as String))
        return
    }

    let result = SecTrustSettingsSetTrustSettings(certificate!, .user, [kSecTrustSettingsResult: NSNumber(value: SecTrustSettingsResult.trustAsRoot.rawValue)] as CFTypeRef)
    print("result = \(result) : " + (SecCopyErrorMessageString(result, nil)! as String))
}