gpt4 book ai didi

objective-c - 如何为 SSL 握手配置 CFStream(或 NSStream)?

转载 作者:太空狗 更新时间:2023-10-30 03:44:34 24 4
gpt4 key购买 nike

我正在使用 CFStream/NSStream 建立 http 连接。我希望能够检测到 SSL 握手在三种情况下失败:

  • 情况 A:服务器不受信任
  • 情况 B:服务器受信任但要求提供客户端证书
  • 案例 C:服务器不受信任,它要求提供客户端证书

今天没有对我的 CFStream 的 SSL 属性做任何事情,我得到:

  • 案例A:错误-9807
  • 情况 B:没有错误,但服务器拒绝连接(错误 500)
  • 案例 C:错误 9807

有没有办法配置 CFStream 来正确区分这 3 种情况?或者在 SSL 握手期间有一些回调?

感谢您的帮助。

最佳答案

前段时间,我在使用 SSL 的 CFSockets 上运行了同样的东西。 CFStream 处理所有握手的事情。我为 NSStream 添加了一些类(基本代码来自 Apple,不再有链接,如果我找到它我会添加它)。这对我有用。

界面

@interface NSStream (FSNetworkAdditions)

+ (void)qNetworkAdditions_getStreamsToHostNamed:(NSString *)hostName
port:(NSInteger)port
inputStream:(out NSInputStream **)inputStreamPtr
outputStream:(out NSOutputStream **)outputStreamPtr;

@end

和实现

#import "FSNetworkAdditions.h"

@implementation NSStream (FSNetworkAdditions)

+ (void)qNetworkAdditions_getStreamsToHostNamed:(NSString *)hostName
port:(NSInteger)port
inputStream:(out NSInputStream **)inputStreamPtr
outputStream:(out NSOutputStream **)outputStreamPtr
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

assert(hostName != nil);
assert( (port > 0) && (port < 65536) );
assert( (inputStreamPtr != NULL) || (outputStreamPtr != NULL) );

readStream = NULL;
writeStream = NULL;

CFStreamCreatePairWithSocketToHost(
NULL,
(CFStringRef) hostName,
port,
((inputStreamPtr != NULL) ? &readStream : NULL),
((outputStreamPtr != NULL) ? &writeStream : NULL)
);

NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredRoots,
[NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,
//kCFNull,kCFStreamSSLPeerName,
kCFStreamSocketSecurityLevelSSLv3, kCFStreamSSLLevel,
[NSNumber numberWithBool:YES], kCFStreamPropertyShouldCloseNativeSocket,
nil];

if (readStream) {
CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);
}

if (writeStream) {
CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);
}

if (inputStreamPtr != NULL) {
*inputStreamPtr = CFBridgingRelease(readStream);
}
if (outputStreamPtr != NULL) {
*outputStreamPtr = CFBridgingRelease(writeStream);
}


}

@end

就是这样,现在您可以像这样连接到服务器:

NSInputStream   *inputStream;
NSOutputStream *outputStream;
[NSStream qNetworkAdditions_getStreamsToHostNamed:host
port:port
inputStream:&inputStream
outputStream:&outputStream];

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

其中“self”符合 NSStreamDelegate 协议(protocol)。

我希望这些片段对您有所帮助。

关于objective-c - 如何为 SSL 握手配置 CFStream(或 NSStream)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13534091/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com