在HTTPS环境下使用NSURLSession,证书验证无法通过

调试信息

测试环境是SSL3.0/TLS1.0,证书是通过Verisign颁发的

错误信息是:9846, An ssl error has occurred and a secure connection to the server cannot be made

实现了“NSURLSession:didReceiveChallenge:completionHandler”, 并使用“completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, 
>nil)”

  • 回答无效,收到三次challenge后Request失败

可以使用独立的代码重现这个问题,所以可以确定与APP本身逻辑无关

在iPad上装了服务器证书,但是问题依然存在

ATS已经关闭

换回NSURLConnection验证可以通过: 在“connection:canAuthenticateAgainstProtectionSpace:”方法中返回NO,可以直接忽略Server Trust Challenge

解决方法

为什么收到多次的challenge,最终还是失败:需要连接的服务器并不支持TLS1.2,而iOS默认支持的版本是TLS1.2,这样,iOS在失败后会尝试着继续与服务器连接,这里的不同点是,NSURLConnection会尝试低版本的TLS,但是NSURLSession却会继续尝试TLS1.2,这就导致了连接失败

最简单也是推荐的解决方法是升级服务器,支持TLS1.2

如果还是希望支持TLS1.0:

将:NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];

修改成:

NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.TLSMaximumSupportedProtocol = kTLSProtocol1;
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];

这里将最高版本设置成1.0,也就是意味着NSURLSession将只会尝试连接TLS1.0。

其实这里有个问题,我们尝试过将“TLSMinimumSupportedProtocol” 设置成TLS1.0,但是事实上iOS并不会去尝试连接低版本的TLS

时间: 2024-10-09 18:03:18

在HTTPS环境下使用NSURLSession,证书验证无法通过的相关文章

如何在没有https环境下使用webrtc

新版本的webrtc使用需要Https,但是在内网开发调试时,要配置Https环境比较麻烦,下面的方法是教你如何在http下使用webrtc 1,点桌面上的Chrome图票,右键->属性,把目票输入框中的内容换成以下内容 "C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe" --unsafely-treat-insecure-origin-as-secure="http:/

XP环境下的网络证书问题

项目过程中,由于是收银系统需要从服务器获取支付二维码,会产生SSL连接的问题,在win7.win10上都没有问题,放到WIN XP上出现了The underlying connection was closed:could not establish trust, 经过查阅相关资料发现是证书问题,采用了最简单的快捷的禁止证书验证,代码如下 //将客户端访问的证书修改为无证书 ServicePointManager.ServerCertificateValidationCallback = (se

Windows servers 2008 环境下,CA证书服务器搭建。

CA证书这个东西好像是很久之前的东西了,现在已经不大用了,不过还是作为一种服务,搭建一下. 环境:Windows servers 2008 (虚拟机环境) 1.配置IP地址. 2.添加角色. 选择Active Directory 证书服务 下一步,记得勾上证书颁发机构Web注册 这里建立的是独立类型的CA. 第一次,选根CA 新建私钥 默认即可 这里的名称默认也行,为了方便好记我这里设置为fly. 时间随意,按需要来 依旧默认 这里如果没有装web还要装一下web环境 安装 安装完之后可以打开进

一个简单的SSL Server和SSL Client来讲解Java环境下SSL的通信原理

首先我们先回顾一下常规的Java Socket编程.在Java下写一个Socket服务器和客户端的例子还是比较简单的.以下是服务端的代码: Java代码   package org.bluedash.tryssl; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Serve

有了SSL证书,如何在IIS环境下部署https?【转载】

昨天各位小伙伴都很开心的领取了自己的SSL证书,但是大部分小伙伴却不知道如何部署,也许是因为第一次接触SSL这种高端的东西吧,不过个人觉得就是懒懒懒...本来小编也挺懒的,但是答应了各位小伙伴的,那么今天就教大家如何在IIS环境下部署HTTPS证书吧.(建议在PC端阅读) 1.首先我们要取走我们的证书,保存在我们本地的电脑里,然后复制到服务器即可. 2.取走后接下来干嘛?当然是打开文件看看里面有些什么啊.我们找到IIS那个压缩包并解压. 3.解析得到pfx文件,也就是我们需要部署域名的证书文件.

有了SSL证书,如何在IIS环境下部署https?

昨天各位小伙伴都很开心的领取了自己的SSL证书,但是大部分小伙伴却不知道如何部署,也许是因为第一次接触SSL这种高端的东西吧,不过个人觉得就是懒懒懒...本来小编也挺懒的,但是答应了各位小伙伴的,那么今天就教大家如何在IIS环境下部署HTTPS证书吧.(建议在PC端阅读) 1.首先我们要取走我们的证书,保存在我们本地的电脑里,然后复制到服务器即可. 2.取走后接下来干嘛?当然是打开文件看看里面有些什么啊.我们找到IIS那个压缩包并解压. 3.解析得到pfx文件,也就是我们需要部署域名的证书文件.

在LNMP环境下安装测试HTTPS及其问题

由于现在HTTPS网站已经成为主流,所以今天在我的LNMP环境下测试了一下自建的SSL证书的使用.由于是自己建的CA以及密钥,所以一般的浏览器是不会认为安全,想要让主流浏览器认为安全,还是要花钱到认证机构去申请证书. 以下是我的配置步骤以及碰到的一个问题. HTTPS简介 https就是在http的基础上使用了ssl加密验证,使网络传输更安全. 1.LNMP环境 [[email protected] sslkey]# /application/nginx/sbin/nginx -V nginx

Docker环境下自动更新Let’s Encrypt SSL证书

说明:以下脚本在Ubuntu 18.04运行通过,大部分脚本执行需要管理员权限. 1. 准备docker环境 # 安装必备工具包 apt-get -y install apt-transport-https ca-certificates curl software-properties-common # 添加docker阿里云源,相对官方源速度更快 curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo ap

Nginx环境下配置PHP使用的SSL认证(https)

最近一段时间发现好多网站都从http协议变成了加密的https协议,比如说百度.吾志等等.https看起来比http高端了好多,而且在不同的浏览器向上还会显示出不同于http的URL展示效果(比如说chrome 和QQ浏览器 使用https协议的网址就会变色). 于是自己就想着把自己的网站加一个ssl证书,使之变成https://iwenku.net 最开始我使用的是腾讯云的服务器,服务器系统是Windows,使用Windows虽然坏处挺多,但是也有好处,那就是Windows是图形化界面的,这样