移动互联网实战--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桩实现进行需求分析和实现的介绍, 后一篇文章将详细讲解, 敬请期待.
移动互联网实战--Apple的APNS桩推送服务的实现(1)的更多相关文章
- 移动互联网实战--Apple的APNS桩推送服务的实现(2)
前记: 相信大家在搞IOS推送服务的开发时, 会直接使用javapns api来简单实现, 调试也直连Apple的APNS服务(产品/测试版)来实现. 很少有人会写个APNS的桩服务, 事实也是如此. ...
- APNS/苹果推送服务
Apple Push Notification Service Google Cloud Message/Google 云 消息 Firebase Cloud Messaging
- 2014年国内经常使用移动client推送服务介绍和比較
经过5年移动互联网的迅速发展,如今推送服务方面国内已经出现了非常多产品,比如极光推送,个推,一推,百度推送,友盟推送等,我们在选择推送服务时,首先排除了付费的推送服务,重点调查了免费的推送服务. ...
- 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)
1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...
- 基于Codeigniter框架实现的APNS批量推送—叮咚,查水表
最近兼职公司已经众筹成功的无线门铃的消息推送出现了问题,导致有些用户接收不到推送的消息,真是吓死宝宝了,毕竟自己一手包办的后台服务,影响公司信誉是多么的尴尬,容我简单介绍一下我们的需求:公司开发的是一 ...
- IOS本地,APNS远程推送(具体过程)
添加本地推送 ///本地添加 -(void)addLocalPushNotification:(UIButton*)sender; { NSLog(@"%s",__FUNCTION ...
- IOS 基于APNS消息推送原理与实现(JAVA后台)
Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Pu ...
- oc学习之路----APNS消息推送从证书到代码(2015年4月26号亲试可用)
前言:看这篇博客之前要准备:首先的有一个99刀的个人开发者账号或者199刀的企业开发者账号,其次你用的是apns消息推送,(本人之前四处打听有没有其他消息推送的方法:收获如下:首先如果想做到apns的 ...
- 基于C++ 苹果apns消息推送实现(2)
1.该模块的用途C++ 和 Openssl 代码 它实现了一个简单的apns顾客 2.配套文件:基于boost 的苹果apns消息推送实现(1) 3.最初使用的sslv23/sslv2/sslv3仅仅 ...
随机推荐
- java之代理模式
静态代理: java代理是一种模式--代理模式.采用代理模式,可以在不改变目标类代码的基础上,通过代理对象,来增加额外的功能(比如增加日志检测等)或者只需要目标对象的部分行为. java中,代理分为静 ...
- uva -- 10766
一开始我感觉是模板题 是不想写的 后来发现我的模板上没有 就敲了一遍 可以忽略这句屁话 在信息学竞赛中,有关生成树的最优化问题如最小生成树等是我们经常遇到的,而对生成树的计数及其相关问题则少 ...
- 二模 (10) day2
第一题: 题目大意:求出区间 [L,R]里约数最多的数. L,R<=10^9 解题过程: 1.一开始我就往恶心的数据去想了,比如 L=R=一个超级大的质数.. 那么 用搜索质因子的方法 是 ...
- 端午小长假--前端基础学起来04CSS选择器
定义: 选择器{ 样式: } 选择器指明{}中的样式的作用对象,即作用于网页中的哪些元素 <head><meta http-equiv="Content-Type" ...
- 面试题之spring
一.Spring的理解 Spring是一个轻量级的容器,非侵入性的框架.最重要的核心概念是IOC,并提供AOP概念的实现方式,提供对持久层,事务的支持,对当前流行的一些框架(Struts,Hibern ...
- javascript prototype 剖析
学过javascript的一定对prototype不陌生,但是这个究竟是个什么东西,就不一定很清楚. 我们先对prototype进行一个定义:每个函数都有一个prototype属性,这个属性是指向一个 ...
- C#基础之类、组件和命名空间(二)
一.实例化对象 Student s; 首先是在栈中开辟一块空间叫s,s里面的内容是空: s = new Student(); 在堆实例化Student对象,将对象的引用地址保存到栈s里.因此,s指向S ...
- 关押罪犯(noip2010)
解法: (1)搜索(30分) (2)二分(此题属于最大值最小问题) (3)贪心+并查集 下面着重说一下“贪心+并查集” 因为有A.B两座监狱,每个犯人不是在A,就是在B监狱. 至于每个犯人在那个监狱, ...
- poj1651 区间dp
//Accepted 200 KB 0 ms //dp区间 //dp[i][j]=min(dp[i][k]+dp[k][j]+a[i]*a[k]*a[j]) i<k<j #include ...
- Oracle普通索引,唯一索引,主键的区别
索引是我们经常使用的一种数据库优化手段,适当的业务操作场景使用适当的索引方案,可以显著的提升系统整体查询性能,当然用户体验也随之提高. 在Oracle中,唯一性索引(Unique Index)是我们经 ...