我正在尝试在服务器模式下使用SSL实现套接字安全。使用的证书需要自签名,以编程方式生成一次并存储到Keychain中。
对于套接字功能,我使用CocoaAsyncSocket (https://github.com/robbiehanson/CocoaAsyncSocket),它在内部使用SSLContext和本地安全框架的相关内容。对于自签名证书生成,我使用MyUtilities (https://github.com/snej/MYUtilities/blob/master/MYAnonymousIdentity.h)中的MYGetOrCreateAnonymousIdentity函数
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>"
键,我如何避免提示显示给用户?
嗯,经过一些玩弄,删除和重新创建证书的问题似乎消失了。可能Keychain中的证书以某种方式被破坏或配置错误