说点废话,我一直觉得APPLE是个非常激进的公司, 从早些的Flash,到现在的http,又比如新的Mac连USB口都不给。公司大到这个量级,已经可以凭一己之力促进先进技术的普及了。
本文内容分为以下三部分
- HTTPS协议
- 使用Let's Encrypt在后端部署https服务
- https在iOS上的正确使用姿势
Part1 HTTPS协议
普通的HTTP请求,在通信双方建立了TCP连接之后,就可以进行了。而HTTPS则不同,在建立TCP连接之后,需要先进行SSL协议的握手过程,然后才是HTTP的通信。
SSL的握手过程如下图所示
alice想要与bob进行https的通信,需要以下几步
- alice给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。
- bob确认双方使用的加密方法,并给出数字证书(包含bob的公钥)、以及一个服务器生成的随机数(Server random)。
- alice 确认数字证书(向CA确认)有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给鲍勃。
- bob使用自己的私钥,获取爱丽丝发来的随机数(即Premaster secret)。
- alice和bob根据约定的加密方法,使用前面的三个随机数,生成"对话**"(session key),用来加密接下来的整个对话过程。
上述步骤的最终目的,是为了生成”对话**“,以后的通信都使用这个**进行对称加密(一般对称加解密的速度是比较快的)
那么看到这里,就又一个问题出现了。握手阶段的信息安全如何保障?
答案是无法保障。整个握手阶段,都是明文的。因此如果有第三方窃听了通信,他可以获得Client random、Server random以及加密后的Premaster secret。只要第三方无法**Premaster secret的内容,那么通信就是安全的。
Part2 使用Let's Encrypt在后端部署https服务
可以参考这篇文章
How To Secure Nginx with Let's Encrypt on Ubuntu 16.04
大致步骤
- 安装certbot客户端
- 配置服务器允许方案 /.well-known文件夹
- sudo letsencrypt certonly -a webroot --webroot-path=/var/www/html -d example.com -d www.example.com 这个命令会生成你需要的证书等文件
- 配置Nginx ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
如果速度很慢多半是python的源被墙了,需要改一下pip配置。
Let's Encrypt大法好,退沃通保平安!
Part3 在iOS上使用自己颁发的HTTPS证书的正确姿势
在开发环境,也需要进行HTTPS的话,需要对AFN进行两个设置:允许不合法的证书和不验证域名
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:[self host]]];
manager.securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy.validatesDomainName = NO;
复制代码