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