objective-c - 如何找出我的 SSL 设置有什么问题?

标签 objective-c node.js ssl ios9 windows-server-2012

我有一个 Windows 服务器,带有正确的 SSL 信任链。在此服务器上为我的 voip 应用程序运行一个 nodejs 信令服务器。我以前在CentOS上运行nodejs服务器,但不久前它被迁移到windows。我暂时在应用程序中禁用了 SSL,但现在我再次启用它,我无法连接消息“CFNetwork SSLHandshake 失败(-9824)”。

我知道没有人能帮我找出问题所在,但我希望苹果能提供更具描述性的信息。 9824 只是表示“握手失败”,设备日志显示没有什么特别之处。我补充说:

setenv("CFNETWORK_DIAGNOSTICS", "3", 1);

并检查了它生成的日志,但它只告诉我握手失败:/我尝试添加

CFReadStreamSetProperty(readStream, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);
CFWriteStreamSetProperty(writeStream, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);

到套接字初始化,看看是否允许我连接,但它没有。我还添加了奇怪的 info.plist 片段以允许在 iOS9 上使用 TLS1.0 而不是 TLS1.2,但即使那样也没有改变任何东西。

所以我的问题是:我到底如何获得足够的信息来开始调试这个烂摊子?我知道握手失败了,Apple,但我想知道为什么失败了......

编辑:抱歉格式错误,我很着急:)

这是我的套接字初始化代码:

APP.onlineUsers = [[NSMutableArray alloc] init];

self.didOpenInputStream = NO;
self.didOpenOutputStream = NO;

self.messageQueue = [[NSMutableArray alloc] init];

CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

NSInputStream* inputStream;
NSOutputStream* outputStream;

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)serverUrl, (uint)serverPort, &readStream, &writeStream);

CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);

CFReadStreamSetProperty(readStream, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);//tried without this as well
CFWriteStreamSetProperty(writeStream, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);//tried without this as well

CFReadStreamSetProperty(readStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelSSLv3);//tried v2 this as well
CFWriteStreamSetProperty(writeStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelSSLv3);//tried v2 this as well

inputStream = (__bridge_transfer NSInputStream*)readStream;
outputStream = (__bridge_transfer NSOutputStream*)writeStream;

[inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType];

[inputStream setDelegate:self];
[outputStream setDelegate:self];

self.runLoop = [NSRunLoop currentRunLoop];

[inputStream scheduleInRunLoop:self.runLoop forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:self.runLoop forMode:NSDefaultRunLoopMode];

[inputStream open];
[outputStream open];

self.inputStream = inputStream;
self.outputStream = outputStream;

最佳答案

问题很可能是您的服务器不“符合 ATS”。 ATS 为从 iOS 9 开始的设备带来强制安全性。操作系统 X 10.11。特别是你需要

  • 服务器端的 TLS 1.2,
  • 未使用 SHA 加密的证书(没有 2)。

如果您的服务器不满足此要求,您可以按照说明关闭此服务器的 ATS here .

关于objective-c - 如何找出我的 SSL 设置有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33648296/

相关文章:

objective-c - iOS 7 自动布局 - 忽略通话状态栏

iphone - 在 Facebook 中分享 YouTube 链接

javascript - 在 NodeJS 中 fork

javascript - 从 Angular 端发送文件后,在 Node.js 端编码大文件时出错

apache - 希望非 www 解析为网站的 www 版本,但最近更改为 ssl 并且对添加到 .htaccess 文件的代码感到困惑

iphone - UIToolbar 项目消失 - ios6 中的奇怪错误

iphone - 警告 : passing argument 1 of 'setOn:' makes integer from pointer without a cast

node.js - 与 npm link 链接的包不会更新

c# - 没有证书的 SslStream

.htaccess - htaccess 中的强制 SSL 仅转到主页