1. 背景
2017年1月1日起,苹果App Store中的所有App都必须启用 App Transport Security(ATS)安全功能。App Transport Security(应用程序安全传输),简称 ATS,是苹果在 iOS 9 中首次推出的一项隐私安全保护功能,启用ATS后,它会屏蔽明文HTTP资源加载,强制App通过HTTPS连接网络服务,通过传输加密保障用户数据安全。ATS在 iOS 9 中是默认开启的,但开发者仍然可以选择关闭 ATS,让自己的应用通过 HTTP 连接传输数据。但从2017年1月1日起,这招将行不通了,所有提交到 App Store 的App必须强制开启 ATS。
2. 影响
2.1 100%被拒的情况:
- 使用自有网站的HTTP链接
- 使用自有网站低于TLS1.2标准的HTTPS链接。
2.2以下几种情况是特例,不会被拒:
- App提供流媒体服务,媒体源已经对内容进行了加密,这时只要使用苹果的AV Foundation框架加载内容,就可以无视ATS;
- App的内容如果有来自已知的第三方,可以暂时不用管,让技术设置一下ATS的开关,不过最好的做法是和第三方沟通下,敦促他们所有传输都使用TLS1.2加密。这一条适用于微信的公众号开发。
- App的内容来自于不可知的第三方,比如说允许用户通过App访问任意网站,比如说浏览器app,可以忽视ATS。如果使用框架是WebKit,苹果建议切换到Safari,否则今后可能还会有麻烦事。
3. HTTP和HTTPS的区别:
HTTP:当客户端发送请求,那么服务器会直接返回数据。
HTTPS:当客户端第一次发送请求的时候,服务器会返回一个包含公钥的受保护空间(也成为证书),当我们发送请求的时候,公钥会将请求加密再发送给服务器,服务器接到请求之后,用自带的私钥进行解密,如果正确再返回数据。这就是 HTTPS 的安全性所在。
更加详细的过程:
当浏览器(客户端)需要与某个安全站点建立连接时,先建立TCP连接(三次握手),然后发生 SSL会话握手。
- 浏览器将通过网络发送请求安全会话的消息(通常请求以 https 而非 http 开头的 URL)。
- 服务器通过发送其证书(包括公钥)进行响应。
- 浏览器将检验服务器的证书是否有效,并检验该证书是否是由其证书位于浏览器的数据库中的(并且是可信的)CA 所签发的。它还将检验 CA 证书是否已过期。
- 如果证书有效,浏览器将生成一个==一次性的、唯一的==会话密钥,并使用服务器的公钥对该会话密钥进行加密。然后,浏览器将把加密的会话密钥发送给服务器,这样服务器和浏览器都有一份会话密钥。
- 服务器可以使用其专用密钥对消息进行解密,然后恢复会话密钥。
4.开始配置HTTPS
4.1 准备工作
- 有网站,有服务器,有域名;
- 申请到一个 SSL 证书;
4.2 生成证书的申请文件:
1.先通过 openssl 工具创建一个私钥文件mydomain.key。
sudo openssl genrsa -des3 -out mydomain.key 1024
不同的证书是可能有加密位数不同的,这里用的是 1024,但有可能是 2048;
这个 openssl 工具在 windows 和 linux 上面都可以用。
2.然后我们通过下面的命令生成申请文件 (mydomain.csr)。
sudo openssl req -new -key mydomain.key -out mydomain.csr
这个 csr 文件在向证书颁发机构申请证书的时候需要提交,需要根据上一步的私钥才能产生,然后会需要输入下面一系列的信息:
最终生成好 csr 申请文件,就可以开始申请证书了。
4.3 申请证书
按验证的类别分:
- 域名认证(Domain Validation):认证你的域名所有权和网站,申请验证简单,几分钟即可。
- 组织机构认证(Organization Validation):认证的域名和公司信息需要提交公司资料认证。
- 扩展认证(Extended Validation,简称EV):这种证书会在浏览器中出现“很明显”的绿色地址栏,给用户的可信度最高。有安全评估保证。
个人或小站点可用一类或二类,企业一般用二类认证,少数企业会用到EV认证。
看了看网上SSL证书的价格,便宜的一般都是10美元左右一个子域名/每年,按不同类别、不同品牌等价格在几十美元到几百美元一年。比如能显示绿色地址栏的EV证书和通配符证书贵一些。国内自己的或代理的,比国外贵不少,动辄几千元。其实就是由可信源认证了一下,类似于办证,用起来没什么差别,并非越贵越好。
国外常见的SSL提供商有:Thawte,Go Daddy,VeriSign,RapidSSL,GeoTrust(QuickSSL),StartSSL。
StartSSL、Go Daddy的比较便宜,GeoTrust的价格适中,Thawte和VeriSign的价格较贵。
其中StartSSL的价格是119.8美元/年
https://www.startssl.com/
Go Daddy的价格是669人民币/年
https://sg.godaddy.com/zh/web-security/ssl-certificate/ov-ssl-certificate
最终我们会得到一个.crt证书文件。凭着手上已经注册好的 mydomain.crt 证书和 mydomain.key 私钥文件,就可以在我们的 http 服务上面配置 SSL 了。
5. Nginx ****配置启用**** SSL
5.1 在原有的虚拟主机 server 段配置上修改端口为 443,然后加入如下三行 SSL 配置:
server {
listen 443;
ssl on;
ssl_certificate /var/ssl/mydomain.crt;
ssl_certificate_key /var/ssl/mydomain.key;
}
5.2新增一个 server 段侦听同样域名上的 80 端口,直接 301 跳转到 https 协议上的地址:
server {
listen 80;
server_name www.mydomain.com mydomain.com;
rewrite ^/(.*)$ https://$host/$1 permanent;
}
5.3然后重启一下 Nginx,这时候会要求输入私钥的密码,日后每次重启 Nginx都需要这一步。
至此就配置完毕了。
参考文档:
SSL证书与Https应用部署小结
HTTPS(SSL) 升级实践手札
iOS应用网络安全之HTTPS
iOS - HTTPS
StartSSL免费SSL证书成功申请
App上架重磅通知:App Store安全新规17年1月生效