V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
whyishe
V2EX  ›  推广

还有 13 天,苹果就要关上 HTTP 大门了

  •  2
     
  •   whyishe · 2016-12-19 17:09:14 +08:00 · 4700 次点击
    这是一个创建于 2685 天前的主题,其中的信息可能已经有所发展或是发生改变。

    2017 年 1 月 1 日以后,所有 iOS 需要访问网页的 App 都要面临一个问题: ATS(App Transport Security)。由于 ATS 要求 HTTPS 访问,换句话来说,还有 13 天,苹果就要对 APP 开发者们关闭 HTTP 的大门了。

    主要从自己实操的角度分享一下如何配 SSL 证书和 HTTPS 协议。

    Apple + ATS

    1 、什么是 ATS ?

    ATS 全称 App Transport Security ,是 iOS 9 引入的一套安全机制,默认行为会强制保证所有的网络请求都使用 HTTPS 。

    2 、绕过 ATS ?

    由于这样的要求影响非常广,苹果也是考虑到开发者的过渡问题,预留了一些绕过 ATS 的方法。比如,可以通过在 Info.plist 中添加 NSAppTransportSecurity 字典并且将 NSAllowsArbitraryLoads 设置为 YES 来禁用 ATS 。

    绕过 ATS ?

    但是到了 WWDC 16 后,苹果对 ATS 的推进力度加大,要求从 2017 年 1 月 1 日起,所有的新提交 app 默认是不允许使用 NSAllowsArbitraryLoads 来绕过 ATS 限制的。

    虽然还有其他的一些方法,但是紧随苹果的脚步,采用 HTTPS 传输显然是更好、更安全的一个选择。绕过 ATS 协议并不是一个好的方案,苹果强推 ATS 的目的,也是在于防止意外泄露个人信息,并为应用程序提供默认安全行为。

    3 、启用 HTTPS

    在 APP 的服务器上启用 HTTPS 协议其实并没有想象的那么复杂,只需要通过一些简单的步骤部署 SSL 证书即可完成。

    HTTPS ,是指超文本传输安全协议( Hypertext Transfer Protocol Secure ),是一种在 HTTP 协议基础上进行传输加密的安全协议,能够有效保障数据传输安全。

    证书方面,可以选择免费版的 Let's Encrypt ,也可以购买权威机构颁发的 CA 证书。后者是一个更加可靠、安全的选择,许多云厂商也提供有类似的 SSL 证书服务,并且可以部署到 CDN 上。

    由于笔者个人使用腾讯云的服务比较多,下面以腾讯云为例介绍如何申请、部署 SSL 证书。腾讯云的 SSL 证书是由 GeoTrust 颁发的,可免费使用一年。如果你是阿里云或其他云厂商的用户,可以查看各自对应的证书产品。

    3.1 、申请证书

    登录腾讯云之后,前往 SSL 证书管理控制台,点击申请证书,会弹出证书选择框。目前只能选择 GeoTrust 颁布的证书,后续似乎会开放更多证书厂商的产品。

    申请证书 1

    接下来,需要填写一些申请信息,最重要的是绑定域名。假如你的域名的 abc.com ,需要填写的必须是类似 a.abc.com 这样非顶级域名。

    申请证书 2

    下一步,会要求手动进行 DNS 验证。具体的步骤可参考产品文档:域名验证指引

    一般配置正确的话,很快就可以拿到属于自己的免费证书了。据笔者个人的情况来看,大概一刷新就可以通过审核。

    3.2 、服务器安装证书

    审核通过后,可以在SSL 证书管理控制台看到证书下载链接。先将证书下载到本地,并上传到 App 的服务器,为服务器上安装证书做好准备。

    这里,我们以较为常用 Nginx 为例介绍具体安装过程。如果使用的是 Apache 或 IIS 等其他服务器,请参考官方文档

    3.2.1 获取证书

    Nginx 文件夹内获得 SSL 证书文件 1_www.domain.com_bundle.crt 和私钥文件 2_www.domain.com.key

    • 1_www.domain.com_bundle.crt 文件包括两段证书代码 “-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”
    • 2_www.domain.com.key 文件包括一段私钥代码“-----BEGIN RSA PRIVATE KEY-----”和“-----END RSA PRIVATE KEY-----”。

    3.2.2 证书安装

    将域名 www.domain.com 的证书文件 1_www.domain.com_bundle.crt 、私钥文件 2_www.domain.com.key 保存到同一个目录,例如 /usr/local/nginx/conf 目录下。

    更新 Nginx 根目录下 conf/nginx.conf 文件如下:

    server {
            listen 443;
            server_name www.domain.com; #填写绑定证书的域名
            ssl on;
            ssl_certificate 1_www.domain.com_bundle.crt;
            ssl_certificate_key 2_www.domain.com.key;
            ssl_session_timeout 5m;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
            ssl_prefer_server_ciphers on;
            location / {
                root   html; #站点目录
                index  index.html index.htm;
            }
        }
    

    配置完成后,先用 bin/nginx – t 来测试下配置是否有误。正确无误的话,重启 nginx ,就可以使 https://www.domain.com 来访问了。

    4. CDN 上部署 HTTPS

    很多网站都会使用 CDN 服务,因为云厂商一般有提供一些免费的 CDN 流量额度,比如腾讯云就有 60GB 的免费流量。

    对于使用了 CDN 的 App 或网站,还可以将 HTTPS 部署在全网 CDN 节点,实现全网数据加密传输功能。

    4.1 配置 HTTPS 的条件:

    • 域名管理页面,域名的状态为 部署中已启动
    • 域名不是由 COS 同步而来的 .file.myqcloud.com 后缀域名。
    • 域名的接入方式为 自有源 或者 COS 源、 FTP 源。

    登录CDN 控制台,进入 [域名管理] 页面,点击域名右侧 管理 按钮,进入管理页面:

    在 [高级配置] 中找到 HTTPS 配置模块

    4.2 证书类型

    腾讯云 CDN 目前支持两种方式部署证书:

    • 自有证书:将自有证书、私钥内容上传至 CDN 进行部署,全程加密传输,证书不落地,保障您的证书安全。
    • 腾讯云托管证书:也就是上面咱们已经申请成功的 SSL 证书。

    4.3 证书配置

    前往CDN 高级工具-证书管理界面,

    根据情况选择希望配置证书的域名、证书类型和回源方式即可。这里需要满足前面提到的这个条件:域名的状态为 部署中已启动

    勾选“腾讯托管证书”后,可以在证书列表下拉菜单中找到刚才申请到的证书。回源方式选择为 HTTPS ,之后提交即可。

    证书配置成功后,会出现 强制跳转 开关,开启后,即使用户发起 HTTP 请求,也会强制跳转为 HTTPS 进行访问。

    检测部署效果

    完成上面一系列的操作之后,还需要最后确认部署的 SSL 证书是否符合 ATS 要求。否则,折腾了那么久,最终却是做了无用功的话,那是非常痛苦的一件事。

    对此,云厂商也是提供了较为方便的检测方式,只需要输入目标域名即可一键检测。

    ATS 检测结果

    至此,就完成了 App 服务器的 SSL 证书部署,并满足了苹果 ATS 协议的严格要求。 本文首发腾云阁: https://www.qcloud.com/community/article/274113001482113656

    19 条回复    2016-12-20 03:50:43 +08:00
    luoyou1014
        1
    luoyou1014  
       2016-12-19 17:24:11 +08:00
    想问下腾讯内部对于第三方链接是怎么处理的,如果我在微信中发个 http://xxx.com ,是不是直接就点不开了?
    网址只是举例……
    crashX
        2
    crashX  
       2016-12-19 18:52:18 +08:00
    这个广告 666
    WildCat
        3
    WildCat  
       2016-12-19 18:54:39 +08:00 via iPhone
    @luoyou1014 浏览器可以添加 exception
    victsdo2005
        4
    victsdo2005  
       2016-12-19 20:27:18 +08:00 via iPhone
    除了腾讯阿里,国内还有啥能做类似 https 化的云服务厂商吗😳
    wwqgtxx
        5
    wwqgtxx  
       2016-12-19 20:34:20 +08:00 via iPhone
    @luoyou1014 腾讯的浏览器本来就有 proxy 呀,只要把 proxy 改造成 https 的就行了
    Benisme
        6
    Benisme  
       2016-12-19 20:38:57 +08:00
    广告不错。那么谁来做一下阿里的广告我好学一下
    bdbai
        7
    bdbai  
       2016-12-19 20:41:07 +08:00 via Android
    非 iOS 开发者,问下用自签名证书做中间人抓请求的方法还能用吗?
    zapper
        8
    zapper  
       2016-12-19 20:42:00 +08:00
    话说如果 API 服务器只有 IP 地址怎么办
    crayygy
        9
    crayygy  
       2016-12-19 21:07:15 +08:00 via iPhone
    @zapper HTTPS 和 通过域名或者通过 IP 访问矛盾么?
    zhidian
        10
    zhidian  
       2016-12-19 21:12:25 +08:00
    @victsdo2005 不知道七牛算不算。前几天他们也发邮件说现在可以免费升级 https ,几千块的证书白送什么的。(当然流量不免费哈哈)
    Showfom
        11
    Showfom  
       2016-12-19 21:13:27 +08:00
    推荐来 https://ssl.do/ 购买证书

    最便宜的 ShinoSaki 证书三年只要 $13.95

    https://saki.ssl.do/cart.php
    Showfom
        12
    Showfom  
       2016-12-19 21:17:38 +08:00   ❤️ 1
    @zapper 除非你是 IP 所有者,否则没办法给 IP 申请 https 证书
    whyishe
        13
    whyishe  
    OP
       2016-12-19 21:46:16 +08:00
    @zapper 你的只有 IP 我理解应该不属于 APPLE 允许的例外情形,详细地你可以看下 https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33

    @bdbai 腾讯云目前提供免费的 SSL 证书,为什么不申请一个呢?
    squid157
        14
    squid157  
       2016-12-19 22:13:42 +08:00   ❤️ 1
    @zapper 印象里可以让 App 用自己签名的证书,需要额外调整一下,自己签的话, IP 也能吧
    zapper
        15
    zapper  
       2016-12-19 22:32:49 +08:00
    @Showfom 我还真不是 IP 所有者,所以说很蛋疼
    @crayygy 不是很了解这方面,据我所知好像 https 证书都要绑定一个域名?如果不是请赐教
    bdbai
        16
    bdbai  
       2016-12-19 22:43:43 +08:00
    @whyishe 不是应用开发者,抓包用
    Showfom
        17
    Showfom  
       2016-12-19 23:23:03 +08:00
    @zapper 自签的证书甚至可以给 * 签发
    yov123456
        18
    yov123456  
       2016-12-20 00:26:26 +08:00 via iPhone
    ats 不能给指定域名加例外吗
    irainsoft
        19
    irainsoft  
       2016-12-20 03:50:43 +08:00
    最近给博客换证书

    腾讯云这个证书不能申请顶级域名 阿里云和七牛用的免费证书一直无法通过 CA 安全审核...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2209 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 00:29 · PVG 08:29 · LAX 17:29 · JFK 20:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.