我已经看到很多使用安全框架 API 验证客户端或服务器证书的示例,但这只会解决Identification
安全功能的问题,但Confidentiality
数据呢?如何在客户端和服务器之间交换私钥和公钥?Interception
, Modifications
, 或Fabrication
攻击呢?如果有人按照客户的预期假装并发送正确的证书怎么办?
1 回答
如您所记,通过验证证书来提供标识。通过加密提供机密性。通过对数据签名来提供身份验证。它们通常通过网络连接上的 TLS 实现。
简而言之,如果您正确实施和部署 HTTPS,并验证您的证书,那么您将获得您所描述的所有内容。NSURLConnection
如果您只使用“https”URL,默认情况下几乎所有这些都将为您完成。
如果您在服务器上部署证书并保护其私钥,那么攻击者假装拥有该证书是不可行的。只有服务器拥有服务器的私钥(由您来保护私钥不被复制或盗窃)。
一种典型的方法是使用商业证书,其中像 Verisign 这样的证书颁发机构 (CA) 证明私钥是颁发给给定主机的所有者(称为 CN 或通用名称)的。这是一种简单易用的方法,通常具有成本效益。去一个著名的 CA 并购买证书。
但是,您也可以创建自己的公钥/私钥对、保护私钥并在客户端中分发公钥。然后,您可以将您的客户端配置为只接受一个证书而不接受其他证书。这实际上比商业证书更安全。有关这方面的示例,请参阅SelfCert。这是来自我的CocoaConf-RTP-2012 演讲。我将在CocoaConf-DC-2013上进行类似的演讲。它还在iOS:PTL的第 15 章中详细讨论。
客户端证书不太常见。它们用于验证客户端,而不是服务器。要使客户端证书正常工作,每个客户端都必须拥有自己的证书。您不能将私钥作为捆绑包的一部分发送。如果这样做,任何人都可以使用该私钥来模拟客户。(相反,将服务器的公钥放在捆绑包中是完全可以的。它是公开的;你不在乎谁看到它。)
使用CFNetwork
,连接后,您需要使用CFReadStreamCopyProperty
来获取kCFStreamPropertySSLPeerTrust
. 然后,您可以评估返回的SecTrust
对象。也就是说,NSURLConnection
如果您可以使用它,我推荐该代码。如果您需要较低级别的访问权限,您仍然可以使用NSStream
. Jeff Lamarche 在NSStream: TCP and SSL中讨论了这个问题。但如果您需要对 TCP+SSL 进行较低级别的控制,我会推荐使用AFNetworking或CocoaAsyncSocket之类的工具。