iOS推送过程详解

来源:互联网 发布:js获取节点的方法 编辑:程序博客网 时间:2024/06/01 12:23

闲得无聊集成了一下信鸽推送,首先信鸽推送的文档里面有很详细的关于生成推送证书的教程,以后再要生成证书记不住过程的看它就可以了。即使你不用第三方,证书生成的过程是一样的。推送证书生成详细过程

注:需要强调一点的是,我在生成开发证书和发布证书的过程中犯了一个错误,由于两个成证书都需要生成cerSigningRequest(CSR)文件,因此我的发布和开发证书都使用了同一个,于是就怎么着都推送不成功,重新生成了CSR文件再次制作证书就成功了。

证书的作用

为什么要生成这些证书呢?为了支持APNs中的安全模型,服务端和设备必须具有某些证书,CA证书或者是token.

服务端:每一个服务端需要一个唯一的服务端证书和私有的秘钥来验证他们与APNs之间的连接。这个证书,是由苹果提供的,它必须能够鉴别出服务端发布的特定主题,这个特定的主题就是客户端应用的bundle ID.服务端发送给APNs的每一条通知,都带有能鉴别目标设备的设备号。服务端会希望使用APNs服务器提供的服务端证书来验证它正在连接的服务器。

设备:系统使用APNs传递给它的公共服务证书来认证它已经连接的服务器。它有一个唯一的私有的钥匙来向服务器认证自己并建立TLS连接。它在设备活动期间获取设备证书和钥匙并把他们存储在钥匙串中。系统也持有他的特有的设备号,这是他在与服务器的连接过程中获取的。每一个已经注册的客户端应用都有责任向他的服务端传递这个设备号。

APNs:APNs也有必要的证书,CA证书,秘钥(公有的和私有的)来验证连接和服务端与设备的身份。

APNs是如何发挥作用的

APNs服务传输并发送一个来自特定服务器的远程通知给一台特定的设备。通知就是一个简短的信息,这条信息包含两块主要的数据:设备token和有效载荷。设备号类似于电话号码,它包含了能够促使APNs定位到安装了客户端应用的设备。APNs 还使用它来认证一个通知的发送。payload就是一个JSON格式的属性列表,它详细描述了某台设备上的应用的使用者将被如何被通知。

这里写图片描述

远程通知的数据通过一个方向流入。服务端合成一个通知包,这个包包含了客服端应用的设备号和payload。服务端发送通知给APNs而APNs转而把通知发送给设备。当服务端向APNs认证时,它发送他的主题给APNs服务器,APNs据此识别它即将提供数据的应用。现在的主题指的就是目标应用的bundle identifier.

APNS的存在,使得只有特定的服务端才能给特定的app发送通知。他就是一个中间媒介,面向服务端和设备都有多点连接。服务端方面,被称为网关。每一个服务端都通过网关和APNs建立一个或者多个持续安全的连接。并且这些服务端通过APNs向众多安装了他们的客户端应用的设备发送通知。

这里写图片描述

APNS也不会跟任意的服务端建立连接,APNs的连接是和苹果已经同意发送通知的已授权的服务端的。这就叫做APNs的连接信任。同时,在设备连接方面,APNs也必须验证连接是和一台合法的设备之间建立的。

下面介绍APNs与服务器以及设备建立连接的具体过程以及token的产生。

连接过程与Token的产生

APNs与设备连接验证

APNs通过TLS点对点的认证确定一台连接设备的身份。(注意系统负责该阶段的连接信任,你本身不需要做任何事情。)在这个过程期间,一台设备初始化了与APNs之间的TLS连接,APNs返回它的服务证书。设备验证这份证书并且给APNs发送它的设备证书,APNs验证它发送过来的证书。

这里写图片描述

服务器与APNs连接验证

服务端和APNs之间的连接信任也是通过TLS点到点的认证来建立的。这个过程就类似于APNs和设备之间的连接信任。服务端初始化一个TLS连接,从APNs获取服务证书,并且验证这个证书。然后服务端把它的证书发送给APNs,APNs验证这个证书。一旦这个过程完成,一个安全的TLS连接就被建立起来了。APNs就会知道现在的连接是与一个合法的服务器建立的。
注意服务端连接只对一个特定的app的传输是合法的,这个app是根据证书中指定的bundle ID来确定的。APNs也建立了一套证书废止列表。如果一个服务端证书在他的列表上,APNs可能会吊销服务端的信任(也就是说,拒绝连接)。

这里写图片描述

Token的产生过程

应用必须注册才能收到远程推送。通常只要在手机上安装一个应用,它便会提示你是否允许应用给你发送通知,如果你允许了这个操作,应用就会发出一个注册请求。系统接收来自应用的注册请求,与APNs建立连接,并转发这个请求给APNs。APNs使用具有唯一性的设备证书中的信息产生设备编号。设备号中包含设备的标识。然后它使用一个token key将设备号加密并返回给设备(token)。第一次安装注册推送成功之后,你就能通过下面的方法收到来自APNs返回的deviceToken。
- (void)application:(UIApplication )application didRegisterForRemoteNotificationsWithDeviceToken:(NSData )deviceToken
-
设备将设备号以NSData格式返回给请求token的应用。然后应用必须以二进制或者十六进制的格式将设备号传输给他的服务器。这个阶段token信任建立的方式保证了只有APNs可以产生设备号,而这将非常有意义。它可以保证,一台设备传递给他的设备号就是他之前提供给那台设备的,并且是那台设备唯一的token。

这里写图片描述

一条推送通知发送的完整过程

1.设备第一次安装应用时,由上述“token的产生过程”产生token并与服务器共享token。
2.服务器向APNs请求连接,APNs验证服务器是否是苹果已授权服务器,验证过程为上述“服务器与APNs连接验证”过程,验证通过一个安全的TLS连接就建立起来了。服务器向APNs发送通知内容(payload)同时还有deviceToken。
3.APNs接收到deviceToken并解密,根据token中包含的设备ID找到目标设备。
4.目标设备向APNs初始化一条TLS连接,APNs发送给设备自己的服务证书,设备验证通过后,发送自己的设备证书以及deviceToken给APNs,APNs将deviceToken解密并对比设备证书中的设备ID是否一致,验证通过,APNs就会将推送内容发送给目标设备。

这里写图片描述

1 0
原创粉丝点击