iOS https 切换的探究

背景

谷歌从 2017 年起,Chrome 浏览器将也会把采用 HTTP 协议的网站标记为「不安全」网站;苹果从 2017 年 iOS App 将强制使用 HTTPS;在国内热火朝天的小程序也要求必须使用 HTTPS 请求。

1: 什么是HTTPS 

在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。SSL 3.0进行了升级,于是出现了TLS(Transport Layer Security)。目前苹果要求原文:The protocol Transport Security Layer (TLS) must be at least version 1.2。

2: HTTPS原理


原理图



可以参考这份资料:https握手流程。 里面介绍了单向双向加密流程以及区别自行查看。

3: 什么样的证书满足条件呢?

第一种是创建证书请求,然后到权威机构认证,随之配置到服务器;

第二种是自建证书,需要自己配置给服务器。

看文档描述:

These are the App Transport Security requirements:

The protocol Transport Security Layer (TLS) must be at least version 1.2.

Connection ciphers are limited to those that provide forward secrecy (see the list of ciphers below.)

Certificates must use at least an SHA256 fingerprint with either a 2048 bit or greater RSA key, or a 256 bit or greater Elliptic-Curve (ECC) key.

根据原文描述,首先必须要基于TLS 1.2版本协议。再来就是连接的加密方式要提供Forward Secrecy,文档中罗列出支持的加密算法(如下表)。最后就是证书至少要使用一个SHA256的指纹与任一个2048位或者更高位的RSA密钥,或者是256位或者更高位的ECC密钥。如果不符合其中一项,请求将被中断并返回nil。

传输安全协议层(TLS)必须至少1.2版:看下图谷歌的证书信息。


按照图标的指向点击


接的加密方式需要提供“Foward Secrecy”,下面是支持Forward Secrecy的加密方式:

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA

`TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256`

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA



看Google证书算法信息箭头指向地方

但是也要注意证书的合法性,注意是否有效,iOS要求连接的HTTPS站点必须为CA签名过的合法证书。

看几个不符合条件证书的例子:


这个是自己创建的证书没有被验证


这个证书不被信任


证书有效


AFN 可以通过allowInvalidCertificates 来针对以上情况设置

allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO//如果是需要验证自建证书,需要设置为YES

我们可以自己用命令验证下证书合法性。

下面这个都是Fail

以上是自己自建的证书,不会第三方信任的


看一个没问题的证书:


这个是我们自己服务器验证结果


4:自建证书的流程

//第一步,为服务器端和客户端准备公钥、私钥

# 生成服务器端私钥

openssl genrsa -outserver.key1024

# 生成服务器端公钥

openssl rsa -inserver.key -pubout -outserver.pem

//第二步,生成 CA 证书

# 生成 CA 私钥

openssl genrsa -outca.key1024

# X.509 Certificate Signing Request (CSR) Management.

openssl req -new-key ca.key -outca.csr

# X.509 Certificate Data Management.

openssl x509 -req -inca.csr -signkey ca.key -outca.crt

//第三步,生成服务器端证书

# 服务器端需要向 CA 机构申请签名证书,在申请签名证书之前依然是创建自己的 CSR 文件

openssl req -new -key server.key-outserver.csr

# 向自己的 CA 机构申请证书,签名过程需要 CA 的证书和私钥参与,最终颁发一个带有 CA 签名的证书

openssl x509 -req -CA ca.crt-CAkeyca.key-CAcreateserial-inserver.csr-outserver.cr

第四步,生成cer文件

使用openssl 进行转换

openssl x509 -inserver.crt-outserver.cer-outform der

如果对以上命令不是太熟悉可以查下。或者看下图。


常用的帮助信息

可以用命令看看自己生成的一些东西一般在/Users/自己名字下面  ls 看列出来的如下图:


这些就是上面生成的文件信息列表

5:把证书配置到服务器

我用的XAMPP 本机搭建的服务器如下图:


启动所有服务

注意:低版本的Mac OS 系统,Mysql 可能不能自动启动,需要用命令自己启动 : sudo /Applications/XAMPP/xamppfiles/bin/mysql.serverstart

配置修改httpd-ssl.conf文件 把server.crt和server.key的路径修改对就好了 由于我的服务器默认开启ssl,因此我就修改下证书路径就好了。

由于XAMPP自己有了我就不配置了

来在浏览器看下结果

这个是QQ浏览器


Google比较严格看下图:


因此证书需要必须为CA签名过的合法证书


以上是自建证书的流程可以自己玩玩。


6:创建证书请求,然后到权威机构认证,随之配置到服务器

由于我们服务器已经有了,我给后台要一直没反应,没给我,我就自己获取了通过命令 。我们可以使用以下openssl命令来获取到服务器的公开二进制证书。

openssl s_client -connect www.example.com.cn:443 /dev/null | openssl x509 -outform DER > https.cer


搜索找到

7:iOS客户端的适配

单向认证 SSL 协议不需要客户拥有 CA 证书,只需将服务器端验证客户证书的过程去掉。双向认证这种情况要求服务器和用户双方都有证书。

[self.sessionManagersetSecurityPolicy:[NKNetWorkCentercustomSecurityPolicy]];

+ (AFSecurityPolicy*)customSecurityPolicy

{

// /先导入证书

NSString*cerPath = [[NSBundlemainBundle]pathForResource:@"https"ofType:@"cer"];//证书的路径

NSData*certData = [NSDatadataWithContentsOfFile:cerPath];

// AFSSLPinningModeCertificate使用证书验证模式

AFSecurityPolicy*securityPolicy = [AFSecurityPolicypolicyWithPinningMode:AFSSLPinningModeCertificate];

// allowInvalidCertificates是否允许无效证书(也就是自建的证书),默认为NO

//如果是需要验证自建证书,需要设置为YES

securityPolicy.allowInvalidCertificates=YES;

//validatesDomainName是否需要验证域名,默认为YES;

//假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。

//置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。

//如置为NO,建议自己添加对应域名的校验逻辑。

securityPolicy.validatesDomainName=NO;

securityPolicy.pinnedCertificates=@[certData];

returnsecurityPolicy;

}

下面是用花瓶抓包的结果

加密的

8:对于一些第三方http请求的处理

要么他们升级。要么加入ATS 白名单里。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容