iOS 9中使用客户端SSL证书时出现Bug,并生成HTTP 403错误

9
我认为我们刚刚发现了一个iOS 9(截至2015年10月23日的版本)上使用客户端SSL证书与后端API通信时出现的错误。与许多REST服务一样,我们的API生成4xx错误代码以传达状态信息。其中之一是403 Forbidden错误,当客户端尝试访问未授权特定客户端ID访问的路径时会出现此错误。请注意,此HTTP错误发生在客户端SSL证书建立有效连接并已经过客户端ID身份验证之后。
在iOS 9中,这个序列将生成一个无效的客户端SSL错误:
FAILED: Error Domain=NSURLErrorDomain Code=-1206 "The server “our.server.here” requires a client certificate."
(注:这是我在这里的推文的跟进:https://twitter.com/ckmaresca/status/657576686318256128 - 我认为SO是大多数人搜索此内容的地方)
1个回答

16
花费我们数天时间才终于找出了问题所在,原来是由于苹果全新的应用传输层安全性(Application Transport Layer security)所导致。具体而言,如果您使用客户端证书并且后端API生成HTTP 403错误,则ATL认为证书无效并杀死整个事务。
我们之所以知道这一点,是因为我们可以在服务器日志中看到请求已经通过并正常执行。我们还观察到,套接字(socket)会在整个请求期间保持活动状态,而且只有在从服务器接收响应后才会出现此错误。我们也知道我们的客户端证书有效,因为任何未返回403的路径都能完美运行,将HTTP错误代码更改为401即可解决此问题。
这有一些问题,但主要问题在于HTTP错误不是SSL错误。两者可以独立操作,有可能有一个有效的客户端SSL证书与403错误。解决方法是将所有403错误更改为其他内容。我想指出的是,大量的Oauth1/2服务器将生成各种403错误,因此这可能非常棘手。或者,可以尝试使用反向代理将HTTP 403错误重新映射到不同的HTTP代码-我们尚未进行测试。
我们已向苹果提交了一个bug报告,但我想提前通知大家,这样也许可以避免像我们一样撞墙一周的情况发生...
感谢Sherbit.io工程团队(特别是Varun和Matt)进行调试。

嘿@ckm,我遇到了完全相同的问题,并花了几天时间解决它。你最终使用了什么解决方案?我无法控制服务器不返回403错误。:( 你找到了任何解决方法吗? - Raphael Oliveira
你能否也粘贴一下 rdar 链接吗? - Raphael Oliveira
@ckm,我们仍然遇到同样的问题,雷达有任何更新吗? - Chandra
抱歉,我不知道。如果您正在开发iOS应用并且可以访问Web服务器,那么测试就非常容易了。 - ckm
我遇到了同样的问题。但我的请求没有到达API服务器,而是在设备端失败,并显示相同的“需要客户端证书”错误。有什么帮助吗? - Ashok
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接