移动互联网实战--Apple的APNS桩推送服务的实现(1)

前记:
  相信大家在搞IOS推送服务的开发时, 会直接使用javapns api来简单实现, 调试也直连Apple的APNS服务(产品/测试版)来实现. 很少有人会写个APNS的桩服务, 事实也是如此. 只是当时我所面临的应用场景有些特殊, 为了测试服务的性能和调试功能方便, 特地写了APNS的桩服务(其实主要原因是当时的iphone测试机, 被小组长"霸占"占为己用, ⊙﹏⊙b汗). 在此写一篇关于APNS桩服务的文章, 以此纪念逝去的"青春", 也希望对读者有所帮助.
  有些事情回想起来, 历历在目, 清晰异常, 仿佛发生在昨天. 犹记一年前, 开发IOS的APNS推送后端服务, 吐血三升...

本文侧重一些基础知识, 具体实现详见后一篇.

基础知识:
  APNS(Apple Push Notification Service)协议, 用于解决通过APNS服务来实现往IPhone手机推送消息的基础需求.
  其基本的流程如下所示:

  

  服务端和客户端基础架构

  

  二进制网络协议:
  APNS的二进制协议设计,格外注重吞吐量. v1版本完全摒弃ack机制, 服务推送遇到异常, APNS服务器会直接断开连接. v2版本弱化ack机制, 只有错误的那个推送消息, 才会ack并携带出错信息(比如bad device token), 然后才断开连接.
  1). v1版本的协议:
  
  2). v2版本的协议
  消息推送请求如下:
  
  数据响应如下:
  
  相关的错误码如下:


Status code


Description


0


No errors encountered


1


Processing error


2


Missing device token


3


Missing topic


4


Missing payload


5


Invalid token size


6


Invalid topic size


7


Invalid payload size


8


Invalid token


10


Shutdown


255


None (unknown)

Java SSL编程(JSSE):
  JSSE的类体系如下所示:
  
  评注: 来源于网络, 相关链接请点击. 抽取部分类定义简单介绍.
  SSLContext: 安全套接字协议的实现, 也是SSLSocketFactory/SSLServerSocketFactory以及SSLEngine的工厂.
  KeyStore: 标示密钥和证书的存储设施.
  KeyManager: JSSE密钥管理器.
  TrustManager: 信任管理器.
  X590TrustedManager: TrustManager的子接口,管理X509证书,验证远程安全套接字.

  简单的样列代码如下:

SSLContext ctx = SSLContext.getInstance("SSL");

KeyManagerFactory kmf = KeyManagerFactory
    .getInstance(KeyManagerFactory.getDefaultAlgorithm());

KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load("<KeyStorePath>", "<KeyPassword>".toCharArray());
kmf.init(ks, "<KeyPassword>".toCharArray());

TrustManagerFactory tmf = TrustManagerFactory
    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore tks = KeyStore.getInstance(KeyStore.getDefaultType());
tks.load("<TrustKeyStorePath>", "<TrustKeyPasswod>".toCharArray());
tmf.init(tks);

ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom());

// *) 构建ServerSocket, 用于服务端连接
ctx.getServerSocketFactory().createServerSocket();

// *) 构建Socket, 用于客户端连接
ctx.getSocketFactory().createSocket();

证书管理:

  基本概念:
  SSL的连接创建引入了证书和信任仓库的概念, 其分别委托于KeyMananger, TrustManager进行管理.
  认证方式:
  1). 单向认证: SSL握手过程中, 只需要单方认证即可.
  2). 双向认证: SSL握手过程中, 双方需要各自认证.
  证书的构建过程(单向认证, 服务端举例)
  1). 服务端构建证书

keytool -genkey -v -alias ssl-server -keyalg RSA -keystore ./server_ks -storepass server -keypass 123456 

  2). 导出服务端证书

keytool -export -alias ssl-server -keystore ./server_ks -file server_key.cer 

  3). 导入到客户端的信任证书仓库

keytool -import -trustcacerts -alias ssl-server -file ./server_key.cer -keystore ./client_ks

  单向认证的证书信任关系就添加完成, 双向认证只需要把客户端的导出证书导入到服务端的信任仓库即可.

密钥库格式/标准:
  JKS和PKCS#12都是比较常用的两种密钥库格式/标准. JKS文件(通常为*.jks或*.keystore,扩展名无关)可以通过Java原生工具——KeyTool生成; 而PKCS#12文件(通常为*.p12或*.pfx,意味个人信息交换文件), 则是通过更为常用的OpenSSL工具产生. 当然, 这两者之间是可以通过导入/导出的方式进行转换的! 当然, 这种转换需要通过KeyTool工具进行! APNS的证书格式采用的P12格式, 即PKCS#12格式标准.

总结:
  这边主要讲述APNS的基本概念和知识, 以及JSSE编程相关的一些类和证书/信任机制. 并没有对APNS桩实现进行需求分析和实现的介绍, 后一篇文章将详细讲解, 敬请期待.

时间: 2024-08-27 00:59:42

移动互联网实战--Apple的APNS桩推送服务的实现(1)的相关文章

移动互联网实战--Apple的APNS桩推送服务的实现(2)

前记: 相信大家在搞IOS推送服务的开发时, 会直接使用javapns api来简单实现, 调试也直连Apple的APNS服务(产品/测试版)来实现. 很少有人会写个APNS的桩服务, 事实也是如此. 只是当时我所面临的应用场景有些特殊, 为了测试服务的性能和调试功能方便, 特地写了APNS的桩服务(其实主要原因是当时的iphone测试机, 被小组长"霸占"占为己用, ⊙﹏⊙b汗). 在此写一篇关于APNS桩服务的文章, 以此纪念逝去的"青春", 也希望对读者有所帮

2014年国内常用移动客户端推送服务介绍和比较

经过5年移动互联网的迅速发展,现在推送服务方面国内已经出现了很多产品,例如极光推送,个推,一推,百度推送,友盟推送等,我们在选择推送服务时,首先排除了付费的推送服务,重点调查了免费的推送服务. 极光推送是我们最早在产品中使用的推送服务,特点是极光只做推送,比较专业,这点从文档和SDK可以看出来.文档比较好,支持平台多,支持Android,iOS,Windows Phone等,并且有Android和iOS平台的插件,对于HybridApp的开发模式比较方便,这是我们最早使用极光推送的一个重要原因.

APNs 远程推送

APNs 远程推送 生成推送证书     1.登陆开发者中心: https://developer.apple.com     2.点开 certificates identifiers 和 proversionprofiles 里面     3.创建APPID. 勾选 push notification servers服务     4.搜索刚才创建的APPID, 点击edit, 配置证书, 下载双击    5.证书创建完成, 钥匙链内右键导出p12     1.App key     2.真机

IOS本地,APNS远程推送(具体过程)

添加本地推送 ///本地添加 -(void)addLocalPushNotification:(UIButton*)sender; { NSLog(@"%s",__FUNCTION__); UILocalNotification* localNotification=[[UILocalNotification alloc]init]; if (localNotification) { //设置时间当前加20秒 NSDate* pushDate=[NSDate dateWithTimeI

IOS 基于APNS消息推送原理与实现(JAVA后台)--转

Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器. 上图可以分为三个阶段. 第一阶段:Push服务器应用程序把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的

转:IOS 基于APNS消息推送原理与实现(JAVA后台)

Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器. 上图可以分为三个阶段. 第一阶段:Push服务器应用程序把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的

ZPush--基于netty4实现的苹果通知推送服务(APNs)Javaclient

简单说下实现苹果通知推送服务(APNs)client的一些要注意的地方: 使用长连接: sanboxserver是无用的,调试时直接用"gateway.push.apple.com"域名: 对于错误的Notification.苹果会回应一个Error response.里面有个identifier,在这个identifier之后的Notification全都失败. 因此发送者要缓存已经发送的Notification,最好设置Notification identifier为增长的整数序列

手把手教你配置苹果APNS推送服务|钿畑的博客 | 钿畑的博客

http://www.360doc.com/content/15/0118/17/1073512_441822850.shtml# 钿畑的文章索引 1. 什么是推送通知 2. 什么是APNS? 3. 推送流程 3.1 获取设备device_token阶段 3.2 消息推送过程 3.3 完整流程介绍 4. Push机制类型 5. 正式开工 5.1 准备工作 5.2 证书生成 6. 客户端制作 7. php服务器端配置 8. 测试 8. 附录: 8.1 JSON示例 8.2 检验证书是否正确的方法:

苹果通知推送服务(APNS)关键特性摘要

1. If APNs attempts to deliver a notification but the device is offline, the notification is stored for a limited period of time, and delivered to the device when it becomes available. 假如用户手机不在线,可能没有信号或者关机吧,APNs会存储转发,等用户在线时再发送 2.Only one recent notif