我正在尝试在服务器模式下实现使用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>"
密钥以及如何避免向用户显示提示?
答案 0 :(得分:0)