Запрос доступа к брелку OS X при рукопожатии SSL

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

Для функциональности сокетов я использую CocoaAsyncSocket ( https://github.com/robbiehanson/CocoaAsyncSocket), который внутренне использует SSLContext и связанные с ним вещи из собственной инфраструктуры безопасности. Для создания самозаверяющего сертификата я использую функцию MYGetOrCreateAnonymousIdentity из MyUtilities ( https://github.com/snej/MYUtilities/blob/master/MYAnonymousIdentity.h)

Код защиты соединения в swift выглядит так:

var error: NSError? = nil
if let identity = MYGetOrCreateAnonymousIdentity("MyIdentity", 60.0 * 60.0 * 24.0 * 365.0 * 10.0, &error)?.takeUnretainedValue() {

    var certificateOpt: SecCertificate? = nil
    SecIdentityCopyCertificate(identity, &certificateOpt)

    // Secure the socket
    let settings: [String:NSObject] = [
        kCFStreamSSLCertificates as String: self.sslCertificates as NSArray,
        kCFStreamSSLIsServer as String: NSNumber(value: true)
    ]
    socket.startTLS(settings)

}
else {
    Swift.print("Failed to get certificates for SSL: \(error)")
    return nil
}

Кажется, код работает нормально: самозаверяющий сертификат создается и сохраняется в связке ключей, а защищенная связь через сокет также работает нормально.

Проблема в том, что во время SSL-рукопожатия (где-то внутри функции SSLHandshake) отображается подсказка Keychain, запрашивающая разрешение на использование ключа "<key>" для подписания. Глядя в брелок, "<key>" ключ, кажется, какой-то другой ключ, а не тот, созданный моей программой.

Так почему "<key>" ключ используется здесь, и как я могу избежать показа пользователю подсказки?

1 ответ

Хм, после некоторой игры, удаления и воссоздания сертификатов проблема, похоже, исчезла. Возможно, сертификаты в связке ключей как-то сломаны или неправильно настроены

Другие вопросы по тегам