我正在尝试在服务器模式下实现一个使用 SSL 保护的套接字。使用的证书需要自签名、以编程方式生成一次并存储到钥匙串中。
对于套接字功能,我使用 CocoaAsyncSocket ( https://github.com/robbiehanson/CocoaAsyncSocket ),它在内部使用 SSLContext 和来自本机安全框架的相关内容。对于自签名证书生成,我使用 MyUtilities 中的 MYGetOrCreateAnonymousIdentity 函数(https://github.com/snej/MYUtilities/blob/master/MYAnonymousIdentity.h)
快速保护连接的代码如下所示:
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 函数中的某个位置),会显示一个钥匙串提示,要求允许使用密钥"<key>"
进行签名。通过查看钥匙串,"<key>"
钥匙似乎是其他钥匙,而不是我的程序创建的钥匙。
那么为什么"<key>"
在这里使用密钥以及如何避免向用户显示提示?