4

我用 GCDAsyncSocket 制作了一个简单的 TLS 服务器,并想要获取客户端的公钥。我尝试使用这个:

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    SSLContextRef ref = [sock sslContext];
    SecTrustRef trust;
    SSLCopyPeerTrust(ref, &trust);

    SecKeyRef key = SecTrustCopyPublicKey(trust);
    NSLog(@"%@",key);
}

但我在 SecTrustCopyPublicKey 方法中得到了 exc_bad_access。如何将公钥作为 NSString/NSData 获取?

4

1 回答 1

0
  1. 您确定有 SSL 连接吗?您的didSecure委托方法是否被调用?
  2. 检查您的trust参考不是NULL在执行SSLCopyPeerTrust功能之后。
  3. 有一个关于Apple 提供SecTrustCopyPublicKey证书、密钥和信任服务参考的讨论。

在调用此函数之前,您必须调用SecTrustEvaluate函数。当您调用此函数时,它会尝试返回叶证书的公钥,即使信任评估不成功。即使信任评估成功,此函数仍可能返回 NULL — 例如,如果由于某种原因无法提取叶证书的密钥。

于 2014-12-02T11:44:59.517 回答