SSL握手时OS X Keychain访问提示

时间:2016-09-07 18:49:12

标签: macos sockets ssl keychain sslcontext

我正在尝试在服务器模式下实现使用SSL保护的套接字。使用的证书需要自签名,以编程方式生成一次并存储到Keychain中。

对于套接字功能,我使用CocoaAsyncSocket(https://github.com/robbiehanson/CocoaAsyncSocket),它在内部使用SSLContext和来自本机安全框架的相关内容。 对于自签名证书生成,我使用MyUtilities中的MYGetOrCreateAnonymousIdentity函数(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
}

代码似乎工作正常:自签名证书已创建并保存在Keychain中,通过套接字的安全通信似乎也能正常工作。

问题是在SSL握手期间(SSLHandshake函数内部)会显示一个Keychain提示,要求允许使用密钥"<key>"进行签名。通过查看Keychain,"<key>"键似乎是其他键,而不是我的程序创建的键。

那么为什么在这里使用"<key>"密钥以及如何避免向用户显示提示?

1 个答案:

答案 0 :(得分:0)

嗯,经过一些游戏,删除和重新创建证书后问题似乎消失了。可能是Keychain中的证书不知何故被破坏或配置错误