需求: 使用自签发证书在 iOS10.3.3 搭建Socket本地服务进行通信时的报 errSSLPeerUnknownCA 错误,如何解决?
**日志: CFNetwork SSLHandshake failed (-9831)
操作步骤:
使用 GCDAsyncSocket 建立本地 HTTPS 通信服务,自签发证书,调用其 startTLS: 方法传递的字典设置如下:
settings[(NSString *)kCFStreamSSLCertificates] = CFBridgingRelease(myCerts);
settings[(NSString *)kCFStreamSSLPeerName] = @“127.0.0.1”
settings[(NSString *)kCFStreamSSLIsServer] = @YES;
settings[(NSString *)kCFStreamSSLValidatesCertificateChain] = @NO;
settings[[@“GCDAsyncSocketUseCFStreamForTLS”]] = @YES;
然后尝试手动信任证书:
SecTrustSetAnchorCertificates(tempTrust, (__bridge CFArrayRef)@[(__bridge_transfer id)myReturnedCertificate]);
SecTrustSetAnchorCertificatesOnly(tempTrust, false);
SecTrustSetPolicies(tempTrust, (__bridge CFArrayRef)@[(__bridge_transfer id)SecPolicyCreateBasicX509()]);
SecTrustResultType trustResult;
OSStatus err = SecTrustEvaluate(tempTrust, &trustResult);
启动服务后在客户端请求,但仍然报错:CFNetwork SSLHandshake failed (-9831),SSLHandshake 方法返回了这个错误:errSSLPeerUnknownCA。但诡异的是以上代码在iOS11上是完全正常的可以通信,我甚至不需要手动信任证书。所以问题出在哪?为什么在iOS11上没有问题?
** 任何其他描述:
我知道可以安装证书手动信任,但我期待以编程方式自动信任自签发证书。我找到了一个方法据说可以设置信任:SecTrustSettingsSetTrustSettings,但这个似乎不属于公开方法,因此不考虑使用。
** 环境: iOS10.3.3 未越狱,Xcode11,GCDAsyncSocket