首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从iOS应用到AWS弹性豆杆后端的间歇性SSL错误

从iOS应用到AWS弹性豆杆后端的间歇性SSL错误
EN

Stack Overflow用户
提问于 2019-07-08 11:15:10
回答 5查看 1.6K关注 0票数 12

几个月来,我的iOS应用程序在向后端发出HTTPS请求时出现了断断续续的SSL错误。

错误描述:

代码语言:javascript
复制
An SSL error has occurred and a secure connection to the server cannot be made.

控制台在调试模式下记录:

代码语言:javascript
复制
2019-07-06 15:12:37.012198+0100 MyApp[37255:12499941] [BoringSSL] nw_protocol_boringssl_input_finished(1543) [C2.1:2][0x159e8e4a0] Peer disconnected during the middle of a handshake. Sending errSSLClosedNoNotify(-9816) alert
2019-07-06 15:12:37.026641+0100 MyApp[37255:12499941] TIC TCP Conn Failed [2:0x280486d00]: 3:-9816 Err(-9816)
2019-07-06 15:12:37.027759+0100 MyApp[37255:12499941] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9816)
2019-07-06 15:12:37.027839+0100 MyApp[37255:12499941] Task <D5AF17C0-C202-4229-BD52-690EFDB10379>.<1> HTTP load failed (error code: -1200 [3:-9816])
2019-07-06 15:12:37.028016+0100 MyApp[37255:12499941] Task <D5AF17C0-C202-4229-BD52-690EFDB10379>.<1> finished with error - code: -1200
2019-07-06 15:12:37.032759+0100 MyApp[37255:12500041] Task <D5AF17C0-C202-4229-BD52-690EFDB10379>.<1> load failed with error Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://api.example.com/v1/example/example?param=example, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <D5AF17C0-C202-4229-BD52-690EFDB10379>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <D5AF17C0-C202-4229-BD52-690EFDB10379>.<1>"
), NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://api.example.com/v1/example/example?param=example, NSUnderlyingError=0x283ff2160 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9816, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9816}}, _kCFStreamErrorCodeKey=-9816} [-1200]

该错误主要发生在3G/4G上,而不是wifi,当网络信号较低时,出现的频率更高。如果它发生了一次,它将继续发生在接下来的几个请求,但最终将再次工作不久。

基于分析、用户评论和用户错误报告:它正在影响很大比例的用户,而不是100%的用户。

-

后端托管在AWS弹性豆柄上。用作Docker应用程序,使用Nginx代理服务器,以及负载均衡器后面的多个实例。

我尝试过增加和缩小实例大小,这似乎没有什么区别。

我最近做了一个全新的弹性豆茎环境,从零,看看这是否有帮助。以前它使用经典负载均衡器,现在它使用应用程序负载均衡器。早期迹象表明,它减少了SSL错误的数量,但它们仍在发生。

新的负载均衡器正在使用此SSL策略:

代码语言:javascript
复制
ELBSecurityPolicy-FS-2018-06

在这里定义:https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-https-listener.html

应该使用不同的SSL策略吗?

-

在应用程序中,web请求是使用URLSession.shared.dataTask...等进行的。我还尝试使用阿拉莫火库来查看这是否产生了影响。但事实并非如此。

我觉得这可能和苹果的应用程序传输安全有关。然而,由于它断断续续的失败,我不知道如何。

相关的苹果文档是这个页面的底部:https://developer.apple.com/security/

如果您需要更多的信息来帮助调试,请告诉我。

-

更新:

因此,在尝试了许多建议之后(感谢大家的贡献!)--并学习了更多关于SSL、负载平衡器等方面的知识--我找到了一些解决问题的方法。

(小警告:我不能百分之百肯定它是完全固定的,因为这个问题的间歇性和我对它的不太好的跟踪,但所有的证据表明它现在是固定的。)

的“修正”是将服务转移到Google 云运行,这对于码头集装箱来说基本上是无服务器的。

关键的是,Google会自动处理SSL证书的设置,所以我没有任何地方可以搞砸。另一个优点是,我现在只支付我实际使用的计算时间,所以它更便宜。

对于任何想要真正解决原来问题的读者表示歉意,但是在下面的答案和评论中有很多好的东西需要研究。

EN

回答 5

Stack Overflow用户

发布于 2019-07-08 11:35:47

免责声明:这不是你问题的答案,我只是想和你一起大声思考

下面是我要检查的几个要点,认为它可以帮助我找出问题的根源,假设您有此信息,或者可以选择获取这些信息,否则它将是一个黑匣子,除非您可以与amazon共同调试。

  • 很明显,这是证书钉扎问题。
  • 通过3g调制解调器检查Wireshark,TLS版本请求被发送,并检查AWS所需的(例如,它们可能需要1.2,而您正在发送1.1 )
  • 这对于检查服务器端的证书字符串并手动将其与客户端进行比较(它可能通过连接管道以不同方式编码)至关重要。
  • 只要您说过,当连接缓慢时,它可能会更频繁地失败,检查证书钉住超时(服务器可能获得部分证书字符串,并将其与其拥有的字符串进行比较,并发现由于连接延迟而导致的不匹配)
  • 确保负载均衡器后面的docker应用程序的所有实例都与您要固定的证书的版本完全相同。
  • 检查其连接失败的iOS版本的统计信息,以及此特定版本中的安全检查。
票数 5
EN

Stack Overflow用户

发布于 2019-07-12 11:13:04

您是否在Info.plist文件中添加了应用程序传输安全设置键?

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSAllowsArbitraryLoadsForMedia</key>
    <true/>
    <key>NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOUR_SERVER_COM</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
        <key>facebook.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
        <key>fbcdn.net</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
        <key>graph.facebook.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>
</plist>
票数 1
EN

Stack Overflow用户

发布于 2019-07-29 13:06:51

首先,我有你描述的所有症状。在寻找解决方案时,网络团队、安全团队、软件团队等等,我都和所有的团队进行了交谈。这是一个很难解决的问题,但简单地解释一下我们是如何解决的将是有用的。

Tip1:如您所见,SSL身份验证并不总是错误的。有时还会有抛错。SSL密钥或基础结构中使用的任何文件最终都是带有字节的文件,这有时会导致此错误,因为并非所有这些文件都可以在您的网络上发送。我想,在我的情况下,甚至是调试的情况是这样的。由此引起的文件包损坏。

Tip2:对于不同的客户端,请求能够正确地工作,有时是不正确的,其一般原因是服务器通过缓存响应某些请求。这通常与负载球的配置有关。在我的例子中,基于cookie的身份验证与软件工程师的其他身份验证模型发生了变化。这会通过ram中的静态对象来演化请求,从而导致字节传输出现问题,从而获得更好的性能。

我强烈推荐的一点。在服务器端,您应该逐个检查Loadballancer的属性。回顾生命周期管理。您甚至可以通过将加载器更改为基于会话或基于cookie的身份验证方法,如果需要的话。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56933733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档