使用自签发证书搭建 Socket 本地服务进行通信时的证书问题求解

需求: 使用自签发证书在 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上没有问题?

** 任何其他描述:
我知道可以安装证书手动信任,但我期待以编程方式自动信任自签发证书。我找到了一个方法据说可以设置信任:SecTrustStoreSetTrustSettings,但这个方法在非越狱环境没有执行权限,无法使用。

** 环境: iOS10.3.3 未越狱,Xcode11,GCDAsyncSocket

1 Like