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