我有一个运行在iOS 13.3设备(iPhone XR)上的iOS应用程序,它使用Swift NIO Transport Services启动了本地websocket服务器,监听我应用程序中的127.0.0.1:9002。
我有一个自签名证书,用于在Swift NIO中设置TLS选项。该证书符合Apple在此处指定的要求:Requirements for trusted certificates in iOS 13 and macOS 10.15。根CA在我的设备上受到明确信任,并且还遵守要求。
在我的应用程序内部,我加载了一个显示网站https://www.websocket.org/echo.html的WKWebView。
当我尝试连接到:wss://127.0.0.1:9002时,我总是遇到相同的错误:
WebSocket网络错误:操作无法完成。 (OSStatus错误-9807。)
“安全性”框架中的代表:
errSSLXCertChainInvalid
我想指出的是,当我尝试不使用TLS的相同步骤时,一切正常。
您知道我的证书在做什么错吗?几天以来,我一直在努力。 谢谢。
编辑:我找到了问题的原因,我忘记在服务器端添加完整的正确证书链,因此客户端无法正确验证服务器的身份,因为我有仅服务器证书,而不是整个证书链,包括中间证书和根CA。
答案 0 :(得分:0)
我创建了一个包来处理用iOS的Obj-C编写的套接字,它考虑了Apple施加的最新TLS限制(这是您遇到的问题)。查阅我的帮助程序类的github页面,在给定新限制的情况下,有很多关于如何正确创建证书的好信息。如果不这样做,您将无法握手。
https://github.com/eamonwhiter73/IOSObjCWebSockets/tree/master
此外,特别是-由于您的错误,它识别出证书“链”(CA->中间CA->服务器证书)无效。该链中的任何部分都可能引起问题,如果您不使用中间CA来签署服务器证书,它也可能无法正常工作-我从来没有真正测试过这一点。