由于iOS 10中的nonce-count错误,HTTP摘要式身份验证失败

时间:2016-09-20 06:20:14

标签: ios xcode http authentication nsurlsession

HTTP摘要身份验证在我们的应用程序中不再适用于iOS 10,原因是授权:NSURLSession生成的摘要标头中的错误计数。

相同的代码适用于iOS 9,但无法在iOS 10中进行身份验证

  1. 使用NSURLRequest创建POST请求
  2. 使用NSURLSession
  3. 启动它
  4. urlSession(_:didReceive:completionHandler:)委托中处理NSURLAuthenticationMethodHTTPDigest
  5. 服务器以401响应并且qop =" auth"字符串按预期
  6. 应用程序再次请求Authorization:Digest标头集。

    根据RFC2617

      

    随机数计数

         

    如果发送了qop指令(见上文),则必须指定   如果服务器没有发送qop指令,则不能指定   WWW-Authenticate头字段。 nc值是十六进制   请求数量(包括当前请求)   客户端已在此请求中使用nonce值发送。对于   例如,在响应给定nonce发送的第一个请求中   值,客户端发送" nc = 00000001"。这个目的   指令是允许服务器检测请求重放   保持自己的这个计数副本 - 如果相同的nc值是   看了两次,那么请求就是重播。请参阅说明   以下是请求摘要值的构造。

    然而,nonce-count从" nc = 00000002"开始。即使是iOS 10中的第一个请求,也会导致服务器拒绝它。

  7. 预计服务器响应200 OK

  8. iOS 9&之前:

    POST /Tunnel/Message.aspx HTTP/1.1
    Host: 172.18.70.12:3454
    Accept: */*
    Content-Type: application/xml
    User-Agent: iViewer/1 CFNetwork/758.5.3 Darwin/15.6.0
    Connection: keep-alive
    Cookie: 
    AuthType: digest
    Accept-Language: zh-tw
    Content-Length: 69
    Accept-Encoding: gzip, deflate
    Authorization: Digest username="admin", realm="ND8422P", 
    nonce="cc17a78cdd96d54e012eadefe7d13d82", uri="/Tunnel/Message.aspx", 
    response="51587db4bcf6eeece68c4ec21108f170", 
    cnonce="47b8df8a980f280038834b7817250e90", nc=00000001, qop="auth"
    <?xml version="1.0" encoding="UTF-8"?><GetServerInfo></GetServerInfo>
    
    HTTP/1.0 200 OK
    Cache-Control: no-store, no-cache, must-revalidate
    Cache-Control: post-check=0, pre-check=0
    Pragma: no-cache
    Content-Type: text/xml
    Content-Length: 1127
    

    iOS 10:

    POST /Tunnel/Message.aspx HTTP/1.1
    Host: 172.18.70.12:3454
    Accept: */*
    Content-Type: application/xml
    User-Agent: iViewer/1 CFNetwork/808.0.2 Darwin/16.0.0
    Connection: keep-alive
    Cookie: 
    AuthType: digest
    Accept-Language: en-us
    Content-Length: 69
    Accept-Encoding: gzip, deflate
    Authorization: Digest username="admin", realm="ND8422P", 
    nonce="4b8bf8549da0c3010f031472e95f387d", uri="/Tunnel/Message.aspx", 
    response="91cf44bc0aadf2f743164d03b5c708c7", 
    cnonce="b5f9e6c69e19c1b396298d68f2aefe7e", nc=00000002, qop="auth"
    <?xml version="1.0" encoding="UTF-8"?><GetServerInfo></GetServerInfo>
    
    HTTP/1.0 401 Unauthorized
    WWW-Authenticate: Digest qop="auth", realm="ND8422P", nonce="8e8b0538bb08876ac4d8203f1d14e9ac"
    CSeq: 0
    

    有人面临同样的问题吗?

    我能找到的唯一相关帖子是: Apple Developer Forums : Problem of the digest authentication,但没有进一步的信息。

    如何修复它或在客户端应用程序端获取解决方法而不要求服务器端忽略错误的nonce-count?

    感谢。

4 个答案:

答案 0 :(得分:2)

Apple Developer Technical Support确认这是iOS 10的错误。 希望很快就能解决。

  

感谢您与Apple开发者技术支持(DTS)联系。   我们认为这个问题是一个错误。请使用Bug Reporter工具https://developer.apple.com/bug-reporting/提交错误报告。

更新: Apple在iOS 10.2 Beta 3中解决了这个问题

答案 1 :(得分:1)

有可能,操作系统首先发送一个HEAD请求,而你的服务器端代码没有得到它。我会尝试运行Charles Proxy来验证这是发生了什么。

也就是说,跳过一个nonce计数本身并不表示任何类型的攻击。如果请求以某种方式丢失(例如网络错误),即使在iOS 9中也可能发生。重要的是确保计数不会倒退。所以我认为你的服务器代码是错误的,不应该拒绝开始。

答案 2 :(得分:0)

我们公司遇到的问题与此处描述的相同: Cordova app can't connect with Dynamics NAV Web-Service (ODATA) after update to iOS 10

我们可以在我们的App和使用iOS 10设备的Safari浏览器中重现这个问题。似乎没有简单的客户端解决方法。我们与Apple开了一个Bug报告。

答案 3 :(得分:0)

在我们的案例中,问题已通过10.2 Beta版本解决。