0

我正在尝试在服务器模式下实现一个使用 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>"在这里使用密钥以及如何避免向用户显示提示?

4

1 回答 1

0

嗯,经过一番玩弄,删除和重新创建证书后,问题似乎消失了。钥匙串中的证书可能以某种方式损坏或配置错误

于 2016-09-08T19:04:03.633 回答