HTTPS从最终的数据解析的角度,与HTTP相同。HTTPS将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的安全;而对于接收端,在SSL/TSL将接收的数据包解密之后,将数据传给HTTP协议层。

SSL/TSL包括四次握手,主要交换三个信息:

  1. 数字证书;

  2. 三个随机数;

  3. 加密通讯协议。

其通讯过程如下示意图:

数字证书

该证书一般是由服务器发给客户端,接收方通过验证这个证书是不是由信赖的CA签发,或者与本地的证书相对比,来判断证书是否可信;假如需要双向验证,则服务器和客户端都需要发送数字证书给对方验证。

数字证书的生成是分层级的,从叶节点证书往根证书层层验证(有效期、签名等等),遇到根证书时,发现作为可信锚点的它存在与可信证书列表中,那么验证就通过。例如在钥匙串中可以看到某券商公司申请的证书没有在系统可信任的证书列表中。

下面以某浪sdk里的证书为代表简单说明一下数字证书的内容:

证书字段 证书说明
签发者名称 发布并签署该证书的实体的信息
序列号 数字证书机构(Certificate Authority, CA)给证书的唯一整数,一个数字证书一个序列号
主题名称 用于识别该数字证书的信息
公共密钥信息 可公开的密钥信息
签名 通过签名算法计算证书内容后得到的数据,用于验证证书是否被篡改

三个随机数

这三个随机数构成了后续通信过程中用来对数据进行对称加密解密的“对话密钥”。首先客户端先发第一个随机数n1,然后服务器返回第二个随机数n2(这个过程同时把数字证书发给客户端),这两个随机数都是明文的;而第三个随机数n3,客户端用数字证书的公钥进行非对称加密,发给服务器;而服务器用只有自己知道的私钥来解密,获取第三个随机数。服务端和客户端都有了三个随机数n1+n2+n3后,两端就使用这三个随机数来生成“对话密钥”,在此之后的通信就使用这个“对话密钥”来进行对称加解密。

加密通信协议

双方商量具体使用哪一种加密方式,假如两者支持的加密方式不匹配,则无法进行通信。因为这个过程中,服务端的私钥只用来解密第三个随机数,从来没有在网络中传输过,只要私钥没有被泄露,那么数据就是安全的。

下边主要介绍一下NSURLConnection支持HTTPS的实现设置证书作为可信的锚点代码应用。

// SDWebImageDownloaderOperation

(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{

//通过 challenge.protectionSpace.authenticationMethod 取得保护空间要求我们认证的方式

if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {

if (!(self.options & SDWebImageDownloaderAllowInvalidSSLCertificates) &&

[challenge.sender respondsToSelector:@selector(performDefaultHandlingForAuthenticationChallenge:)]) {

[challenge.sender performDefaultHandlingForAuthenticationChallenge:challenge];

} else {

NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];

[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];

}

} else {

if ([challenge previousFailureCount] == 0) {

if (self.credential) {

[[challenge sender] useCredential:self.credential forAuthenticationChallenge:challenge];

} else {

[[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge];

}

} else {

[[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge];

}

}

}

StockPromotionViewController在webview中使用

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

{

NSString* scheme = [[request URL] scheme];

//判断是不是https

if ([scheme isEqualToString:@"https"])

{

if (self.authed)

{

return YES;

}

NSURLConnection* conn = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:request.URL] delegate:self];

[conn start];

[webView stopLoading];

return NO;

}

return YES;

}

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

{

if ([challenge previousFailureCount]== 0)

{

self.authed = YES;

//NSURLCredential 这个类是表示身份验证凭据不可变对象。凭证的实际类型声明的类的构造函数来确定。回调中会收到一个challenge

NSURLCredential* cre = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];

[challenge.sender useCredential:cre forAuthenticationChallenge:challenge];

}

}

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response

{

return request;

}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

self.authed = YES;

//webview 重新加载请求。

[self.webView loadRequest:[NSURLRequest requestWithURL:connection.currentRequest.URL]];

[connection cancel];

}

iOS 对 HTTPS 证书链的验证的更多相关文章

  1. iOS对HTTPS证书链的验证原理

    今天看到所在的某个开发群问https原理,之前做HTTPS ,下面简单说下原理.希望能帮助你理解. HTTPS从最终的数据解析的角度,与HTTP相同.HTTPS将HTTP协议数据包放到SSL/TSL层 ...

  2. iOS 中对 HTTPS 证书链的验证

    这篇文章是我一边学习证书验证一边记录的内容,稍微整理了下,共扯了三部分内容: HTTPS 简要原理: 数字证书的内容.生成及验证: iOS 上对证书链的验证. HTTPS 概要 HTTPS 是运行在 ...

  3. 【腾讯Bugly干货分享】iOS 中 HTTPS 证书验证浅析

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/-fLLTtip509K6pNOTkflPQ 导语 本 ...

  4. iOS开发HTTPS实现之信任SSL证书和自签名证书

    iOS开发HTTPS实现之信任SSL证书和自签名证书 转自:http://www.jianshu.com/p/6b9c8bd5005a/comments/5539345 (收录一下供自己学习用的) 字 ...

  5. 案例分享-https证书链不完整导致请求失败

    背景 话不多说,直接上堆栈 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX p ...

  6. 使用HttpClient连接池进行https单双向验证

    https单双向验证环境的搭建参见:http://www.cnblogs.com/YDDMAX/p/5368404.html 一.单向握手 示例程序: package com.ydd.study.he ...

  7. 【坑】https证书链不完整的坑

    支付宝支付回调https失败,微信分享https连接在微信里打开空白,而chrome等浏览器访问正常. 是的,以上问题我作为半个运维在项目中遇到了,就是由于https证书链不完整引起的. 好吧,其实压 ...

  8. Java访问HTTPS时证书验证问题

    为了尽可能避免安全问题,公司的很多系统服务都逐步https化,虽然开始过程会遇到各种问题,但趋势不改.最完美的https应用是能实现双向认证,客户端用私钥签名用服务端公钥加密,服务端用私钥签名客户端都 ...

  9. 苹果IOS内购二次验证返回state为21002的坑

    项目是三四年前的老项目,之前有IOS内购二次验证的接口,貌似很久都没用了,然而最近IOS的妹子说接口用不了,让我看看啥问题.接口流程时很简单的,就是前端IOS在购买成功之后,接收到receipt后进行 ...

随机推荐

  1. 移动端 h5开发相关内容总结——CSS篇

    1.移动端开发视窗体的加入 h5端开发以下这段话是必须配置的 <meta name="viewport" content="width=device-width, ...

  2. elasticsearch6.0版本安装head插件

    ES6.0版本安装head插件 1.1 前言 不知道是我电脑问题还是最近的开源软件都比较**,mysql和elasticsearch新版本变动都比较大. elasticsearch6.0貌似已经不支持 ...

  3. Android -- Exif

    Exif Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了数码照片的信息,包括拍摄的光圈.快门.平衡白.ISO.焦距.日期时间等各种和拍摄 ...

  4. Chrome中的哪些端口是限制使用的?

      The following is a list of all of the restricted ports on Chrome: 1, // tcpmux 7, // echo 9, // di ...

  5. [Functional Programming] Arrow contramap vs map and promap

    In previous post, Arrow Functor with contramap, we have seen how to opreating on params before we in ...

  6. Windows系统Ionic安装教程/Ionic环境配置

    原文链接:http://blog.csdn.net/superjunjin/article/details/43412017 参考文章 Cordova 3.x 基础(1) -- 环境搭建(Window ...

  7. Android 之 沉浸式状态栏及顶部状态栏背景色设置

    现在很多应用都引用了沉浸式状态栏,如QQ,效果下图: 效果很酷炫,其实设置也很简单.但是,需要注意的是,这种效果只能在API19以及以上版本中才能够做到. 方法一: 首先,如果想让界面Activity ...

  8. DbScopeFactory

    using (var db = DbScopeFactory.Create()) { //这里修改数据 db.SaveChanges(); }

  9. 安装vmware-tools出错:Execution aborted!!!

    环境:VMware10+RedHat5(安装时选择了虚拟化组件). 安装vmware-tools过程中出现如下所示错误: This configuration program is to be exe ...

  10. JAVA调用SHELL事例

    以往一直都是crontab+shell调用java程序,最近需要反过来,使用java调用shell程序,实现定时管理,今天总结一下. 基础内容: java的java.lang.Runtime类提供了e ...