目前关于公司刚好项目上线,网络环境正在慢慢配置。所以也采用了https 环境下的外网正式,忽然有点懵逼,以前的公司网络环境大多也都是http,虽然iOS9.0系统 后xcode 也已支持https,还是有点不知所措。不过阅读了些许博客,也解决了这个问题。
绝大部分iOS程序的后台服务都是基于RESTful或者WebService的,不论在任何时候,你都应该将服务置于HTTPS上,因为它可以避免中间人攻击的问题,还自带了基于非对称密钥的加密通道!
使用HTTPS有个问题,就是CA证书。缺省情况下,iOS要求连接的HTTPS站点必须为CA签名过的合法证书,AFNetworking是个iOS上常用的HTTP访问库,由于它是基于iOS的HTTP网络通讯库,自然证书方面的要求和系统是一致的,也就是你需要有一张合法的站点证书。
正式的CA证书非常昂贵,很多人都知道,AFNetworking只要通过下面的代码,你就可以使用自签证书来访问HTTPS:
解决办法: AFNetworking是允许内嵌证书的,通过内嵌证书,AFNetworking就通过比对服务器端证书、内嵌的证书、站点域名是否一致来验证连接的服务器是否正确。由于CA证书验证是通过站点域名进行验证的,如果你的服务器后端有绑定的域名,这是最方便的。一般正式的格式时'.cer'格式,如果是 '.pem'格式,则须转换为'.cer' 。(转换方式请自行百度,基本后台提供都是.cer格式)
然后将生成的server.cer文件,如果有自建ca,再加上ca的cer格式证书,引入到app的bundle里,AFNetworking在
情况下,会自动扫描bundle中.cer的文件,并引入,这样就可以通过自签证书来验证服务器唯一性了。
注意点: 验证站点证书,是通过域名的,如果服务器端站点没有绑定域名,仅靠IP地址上面的方法是绝对不行的。怎么办?答案是想通过设置是不可以的,你只能修改AFNetworking的源代码!打开AFSecurityPolicy.m文件
这样,AFSecurityPolicy就只会比对服务器证书和内嵌证书是否一致,不会再验证证书是否和站点域名一致了。
主要是 HTTPS的整个验证体系中,最核心的实际上是服务器的私钥。私钥永远,永远也不会离开服务器,或者以任何形式向外传输。私钥和公钥是配对的,如果事先在客户端预留了公钥,只要服务器端的公钥和预留的公钥一致,实际上就已经可以排除中间人攻击了。