Ich versuche, einen Socket mit SSL im Server-Modus gesichert zu implementieren. Das verwendete Zertifikat muss selbstsigniert sein, einmal programmgesteuert generiert und im Schlüsselbund gespeichert werden.OS X Schlüsselbund Zugriffsaufforderung auf SSL-Handshake
Für Socket-Funktionalität verwende ich CocoaAsyncSocket (https://github.com/robbiehanson/CocoaAsyncSocket), die intern SSLContext und verwandte Sachen aus nativen Sicherheit Framework verwendet. Für selbst signiertes Zertifikat Generation verwenden I MYGetOrCreateAnonymousIdentity Funktion von MyUtilities (https://github.com/snej/MYUtilities/blob/master/MYAnonymousIdentity.h)
Der Code der Verbindung in schnellen wie folgt aussieht Sicherung:
scheintvar 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
}
Der Code zu funktionieren: Zertifikat selbstsignierten erstellt und gespeichert im Schlüsselbund, die gesicherte Kommunikation über den Socket scheint auch in Ordnung zu sein.
Das Problem ist, dass während SSL-Handshake (irgendwo innerhalb der SSLHandshake-Funktion) eine Schlüsselbund-Eingabeaufforderung angezeigt wird, die um Erlaubnis bittet, den Schlüssel "<key>"
zum Signieren zu verwenden. Wenn Sie in den Schlüsselbund schauen, scheint der Schlüssel "<key>"
ein anderer Schlüssel zu sein und nicht der, der von meinem Programm erstellt wurde.
Warum wird hier der Schlüssel "<key>"
verwendet und wie kann ich vermeiden, dass dem Benutzer die Eingabeaufforderung angezeigt wird?