基于iOS,Android的服务器证书失效检测
1.前言
在目前的iOS,Android手机上,当手机应用进行SSL通信时,手机端默认是不会进行服务器证书是否失效的监测。
在iOS上,系统是会定期获取所访问服务器的证书信息然后出存在本地。
在Android端,系统是不会进行任何服务器证书的监测。
2.影响
如果应用在与服务器进行SSL通信时不进行任何的证书有效性检测会造成用户信息泄漏等安全问题。
3.解决方法
服务器证书有效性检测有两种方法,CRL检测和OCSP检测。
OCSP检测主要的好处是时效性更有效率。本文主要从OCSP角度介绍实现方法。
3.1 iOS端
在iOS端,对应不同的通信方法有不同的服务器有效性检测方法
WKWebView,NSURLSession,NSURLConnection等可以通过通用的方法解决。
核心代码如下:
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler
{
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
if ([[[UtilCrlOcsp alloc] init] isServerTrustProceedOrUnspecifiedWithAuthenticationChallenge:challenge]) {
completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
} else {
completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
}
}
} - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
[self updateTextViewMessage:error.description];
} - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
[self updateTextViewMessage:response.description];
} - (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
if ([[[UtilCrlOcsp alloc] init] isServerTrustProceedOrUnspecifiedWithAuthenticationChallenge:challenge]) {
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
} else {
[challenge.sender cancelAuthenticationChallenge:challenge];
}
}
}
而对于WebView,CFNetwork等的通信方法需要实现一些其它的方法。
具体可以参考苹果官网的介绍。
3.2 Android端的实现
在Android端,利用CRL相关的API可以很快的检测证书有效性。
但是对于OCSP的实现却没有任何相关函数支持,所以需要从零进行开发。
开发时可以参考bouncycastle的相关内容进行开发,本文主要介绍OCSP的实现过程
if (true || basicResponse.isSignatureValid(new JcaContentVerifierProviderBuilder().setProvider("BC").build(rootCert.getPublicKey()))) {
SingleResp[] responses = basicResponse.getResponses();
byte[] reqNonce = getNonce(request.getExtension(OCSPObjectIdentifiers.id_pkix_ocsp_nonce));
byte[] resNonce = getNonce(basicResponse.getExtension(OCSPObjectIdentifiers.id_pkix_ocsp_nonce));
// validate the nonce if it is present
if (reqNonce == null || resNonce == null || Arrays.equals(reqNonce, resNonce)) {
for (int i = ; i != responses.length;) {
putLog("OCSP certificate number " + responses[i].getCertID().getSerialNumber());
if (responses[i].getCertStatus() == CertificateStatus.GOOD) {
putLog("---OCSP status GOOD");
return true;
}
else if (responses[i].getCertStatus() instanceof RevokedStatus) {
putLog("---OCSP status Revoked");
return false;
}
else {
putLog("---OCSP status " + responses[i].getCertStatus());
return false;
}
}
}
4.总结
本文只是简单的介绍了基于OCSP的证书有效性检测,具体到真正的项目中该如何应用还需要coder自己的思考。
基于iOS,Android的服务器证书失效检测的更多相关文章
- C#/IOS/Android通用加密解密方法
原文:C#/IOS/Android通用加密解密方法 公司在做移动端ios/android,服务器提供接口使用的.net,用到加密解密这一块,也在网上找了一些方法,有些是.net加密了android解密 ...
- iOS服务器证书不受信任的解决版本
参考文章链接: https://www.cnblogs.com/v-jing/p/6008964.html http://www.cocoachina.com/ios/20151021/13722.h ...
- 移动开发首页业界资讯移动应用平台技术专题 输入您要搜索的内容 基于Java Socket的自定义协议,实现Android与服务器的长连接(二)
在阅读本文前需要对socket以及自定义协议有一个基本的了解,可以先查看上一篇文章<基于Java Socket的自定义协议,实现Android与服务器的长连接(一)>学习相关的基础知识点. ...
- 转:基于IOS上MDM技术相关资料整理及汇总
一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企业宝贵的资产,安全问题更是重中之重,在移动互联网时代,员工个人的设备接入 ...
- [置顶] ArcGIS Runtime SDKs 10.2 for iOS & Android& OS X发布
我们高兴的宣布:ArcGISRuntime SDKs 10.2 for iOS & Android & OS X正式发布!在10.2版本中,你可以在iOS.Android和Mac设备上 ...
- Xamarin体验:使用C#开发iOS/Android应用
Xamarin是Mono创始人Miguel de Icaza创建的公司,旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发. 简介 Xamarin是基于Mo ...
- fir.im Weekly - iOS/Android 应用程序架构解析
假如问你一个iOS or Android app的架构,你会从哪些方面来说呢? 本期 fir.im Weekly 收集了关于 iOS/Android 开发资源,也加入了一些关于 Web 前端方面的分 ...
- 使用 Jenkins 搭建 iOS/Android 持续集成打包平台【转】
背景描述 根据项目需求,现要在团队内部搭建一个统一的打包平台,实现对iOS和Android项目的打包.而且为了方便团队内部的测试包分发,希望在打包完成后能生成一个二维码,体验用户(产品.运营.测试等人 ...
- 仿微信的IM聊天时间显示格式(含iOS/Android/Web实现)[图文+源码]
本文为原创分享,转载请注明出处. 1.引言 即时通讯IM应用中的聊天消息时间显示是个再常见不过的需求,现在都讲究用户体验,所以时间显示再也不能像传统软件一样简单粗地暴显示成“年/月/日 时:分:秒”这 ...
随机推荐
- php精粹-编写高效的php代码 --- php设计模式
1.选择一个最合适的设计模式 没有任何事物是完美的,也没有人说过设计模式一个严格的放之四海而皆准的解决方法.因此你可以改变这些模式,使它们更适合手头的工作.对于某些设计模式而言,他们就是所属程序固有的 ...
- stream_context_create解决file_get_contents超时处理
stream_context_create作用:创建并返回一个文本数据流并应用各种选项,可用于fopen(),file_get_contents()等过程的超时设置.代理服务器.请求方式.头信息设置的 ...
- 解决cocos2d 热更是连不上https服务器
最近苹果宣布所有上架应用都要用https,我们后端走的是同一个函数,导致Android也要连接https. 百度了下,网上说客户端不需要做什么特殊处理,因为cocos本身是支持https的.但是服务端 ...
- 离开ACM了,总结一下
写这篇博客,一如当初我对着电脑显示器,不知道从哪里下手才是,所以没准写着写着就出现了倒叙插叙补叙等充满语文功底的修辞手法,不过不会有45度的妩媚和忧伤. 像一位程序员所说:今天的努力是为了儿时吹过的牛 ...
- POJ 1035 Spell checker 简单字符串匹配
在输入的单词中删除或替换或插入一个字符,看是否在字典中.直接暴力,172ms.. #include <stdio.h> #include <string.h> ]; ][], ...
- AFNetworking的原理与基本使用-b
全称是AFNetworking 虽然运行效率没有ASI高,但是使用比ASI简单 是对NSURLConnection和NSURLSession的各自的一层包装 AFN的内部中的RunLoop AFN内部 ...
- 关于配置ST_Geometry报ORA-06522的问题
环境 SDE版本:10./10.2/10.2.1/10.2.2 Oracle版本:11g R2 11.2.0.1 Windows版本:Windows Server 2008 R2 问题描述及原因 li ...
- canvas仿黑客帝国的字符下落
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ...
- Java多线程初学者指南(11):使用Synchronized块同步方法
synchronized关键字有两种用法.第一种就是在<使用Synchronized关键字同步类方法>一文中所介绍的直接用在方法的定义中.另外一种就是synchronized块.我们不仅可 ...
- Python Web 性能和压力测试 multi-mechanize
http://www.aikaiyuan.com/5318.html 对Web服务做Performance & Load测试,最常见的工具有Apache Benchmark俗称ab和商用工具L ...