Установка доверия сертификата в Swift 5.x для macOS - PullRequest
1 голос
/ 20 апреля 2020

Я пытался понять, как обрабатывать доверие к сертификатам в macOS с помощью Swift 5. Я могу добавить сертификаты CA с помощью командной строки, но хочу использовать код для разрабатываемого приложения вместо того, чтобы полагаться на внешний скрипт и Process ().

Вот код, который у меня есть, но я не понимаю, какое значение я должен передать в функции 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>)
}

Я прочитал документацию и может видеть, какие «возможные» значения использовать, например, trustAs Root, но не знает, как go добавить это для работы функции. Существует не так много материала по использованию этого со Swift для macOS, и любая помощь будет принята с благодарностью.

Моя конечная цель - добавить сертификаты CA к пользователю login.keychain-db, чтобы разрешить доступ к порталам Sharepoint, где я работаю. Я хочу, чтобы они были добавлены и автоматически доверялись, когда пользователь нажимает кнопку для вызова этой функции. Спасибо.

1 Ответ

1 голос
/ 21 апреля 2020

Итак, я смог понять, что мне нужно сделать, используя расширение Swiftify и преобразовав старый целевой код - c в swift. Это сделало быструю реализацию намного более понятной для моей проблемы. Это бесплатное расширение в App Store, и я от всего сердца ценю это. Вот окончательный код, который позволил мне программно установить сертификат и доверять ему.

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

Надеюсь, это поможет бедной душе в будущем решать подобные проблемы. Я хотел бы предложить создать вспомогательный инструмент для обработки повышения привилегий, если вы планируете импортировать много сертификатов, иначе вам, пользователю, придется вводить свой пароль для каждого сертификата.

...