- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我能够通过 IP 和端口连接到所需的套接字。
- (void)socket:(GCDAsyncSocket *)sender didConnectToHost:(NSString *)host port:(UInt16)port {
[sender startTLS:nil];
if(self.createTCPSocketHelperDelegate && @selector(returnConnectedTCPSocket:forNASWithMacAddress:))
{
[self.createTCPSocketHelperDelegate returnConnectedTCPSocket:sender forNASWithMacAddress:_macAddress];
}
}
我正在发送 TLS 设置字典 nil,因为它使用默认设置。它给了我如下错误
Error Domain=kCFStreamErrorDomainSSL Code=-9806 "The operation couldn’t be completed. (kCFStreamErrorDomainSSL error -9806.)" UserInfo=0x17d92420 {NSLocalizedRecoverySuggestion=Error code definition can be found in Apple's SecureTransport.h}
我不明白那里发生了什么问题。请帮我提供一些连接到SSL服务器并使用TCP/TLS协议(protocol)的示例代码。
如果有帮助,我们将不胜感激。先感谢您。 :)
最佳答案
我遇到了这个问题。基本上我无法完成SSL握手,我找到了如下方法:
初始化GCDAsyncSocket套接字并连接到IP和端口,如下所示,
NSError *error;
_gcdAsyncTCPSocket = [[GCDAsyncSocket alloc] initWithDelegate:self
delegateQueue:dispatch_get_main_queue()];
_gcdAsyncTCPSocket.delegate = self;
_ipAddress = ipAddress;
_tcpPortNumber = portNumber;
if(![_gcdAsyncTCPSocket connectToHost:ipAddress onPort:portNumber withTimeout:30 error:&error])
{
if(self.createTCPSocketHelperDelegate && @selector(failedToCreateTCPSocket))
{
[self.createTCPSocketHelperDelegate failedToCreateTCPSocket];
}
}else {
NSMutableDictionary *settings = [[NSMutableDictionary alloc] init];
[settings setObject:[NSNumber numberWithBool:YES]
forKey:GCDAsyncSocketManuallyEvaluateTrust];
[_gcdAsyncTCPSocket startTLS:settings];
}
当您设置 GCDAsyncSocketManuallyEvaluateTrust 时,它会调用委托(delegate)方法
- (void)socket:(GCDAsyncSocket *)sock didReceiveTrust:(SecTrustRef)trust completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler
其中我使用本地证书评估了服务器的自签名证书。如果相等则completionHandler(YES),否则completionHandler(NO)如下:
- (void)socket:(GCDAsyncSocket *)sock didReceiveTrust:(SecTrustRef)trust completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler {
NSLog(@"didReceiveTrust");
//server certificate
SecCertificateRef serverCertificate = SecTrustGetCertificateAtIndex(trust, 0);
CFDataRef serverCertificateData = SecCertificateCopyData(serverCertificate);
const UInt8* const serverData = CFDataGetBytePtr(serverCertificateData);
const CFIndex serverDataSize = CFDataGetLength(serverCertificateData);
NSData* cert1 = [NSData dataWithBytes:serverData length:(NSUInteger)serverDataSize];
//local certificate
NSString *localCertFilePath = [[NSBundle mainBundle] pathForResource:@"LocalCertificate" ofType:@"cer"];
NSData *localCertData = [NSData dataWithContentsOfFile:localCertFilePath];
CFDataRef myCertData = (__bridge CFDataRef)localCertData;
const UInt8* const localData = CFDataGetBytePtr(myCertData);
const CFIndex localDataSize = CFDataGetLength(myCertData);
NSData* cert2 = [NSData dataWithBytes:localData length:(NSUInteger)localDataSize];
if (cert1 == nil || cert2 == nil) {
NSLog(@"Certificate NULL");
completionHandler(NO);
return;
}
const BOOL equal = [cert1 isEqualToData:cert2];
if (equal) {
NSLog(@"Certificate match");
completionHandler(YES);
}else{
NSLog(@"Certificate not match");
completionHandler(NO);
}
}
如果证书与completionHandler(YES)匹配,它将调用委托(delegate)
- (void)socketDidSecure:(GCDAsyncSocket *)sock {
NSLog(@"socketDidSecure");
_uploadSocket = sock;
//Do your stuff after this
}
希望它能帮助某人处理 SSL 和 GCDAsyncSocket。快乐编码!!
关于ios - GCDAsyncSocket startTLS 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36050743/
我有以下代码: import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException
我正在尝试使用 Vala 和 GLib + GIO 实现一个简单的 SMTP 服务器。 到目前为止,纯文本通信没有问题,但当涉及使用 STARTTLS 的 TLS 时,事情会变得更加困难。 这是我到目
每次有人运行 apacheant 来更新我们的实时服务器时,我都会尝试向我的团队发送电子邮件,我尝试通过 GMAIL 发送电子邮件,但是当我运行 ant upload_live -d 时,我收到以下错
我能够通过 IP 和端口连接到所需的套接字。 - (void)socket:(GCDAsyncSocket *)sender didConnectToHost:(NSString *)host por
我正在尝试为我在办公室网络上运行的小型监控脚本设置一些基本的电子邮件功能。在我的 Ubuntu 10.10 服务器上运行脚本(见下文)工作正常,但是当我在 Windows 桌面计算机上运行它时,它会在
我是 python 的新手。我已经对 python 的鸭子类型进行了一些研究,但我遇到了如下情况。 当我查看 Python 标准库时,我发现 API 仅指定参数名称,这些名称似乎提示要传递的内容但类型
最近似乎支持 SSL/TLS added通过 SecureSocket 到 Dart类,这很棒。 所以,例如这个 SecureSocket.connect(_host, _port).then(
我正在尝试使用 TLS 连接到 apacheds,但我得到了一个 LdapOperationException: PROTOCOL_ERROR:服务器将断开连接! 这是我的代码: LdapNetwor
我正在尝试使用 STARTTLS 命令发送电子邮件。我在 Gmail 中设置了一个测试帐户,并将其设置为仅接受具有 TLS 连接的入站电子邮件。 由于我不想深入的原因,我无法使用 JavaMail 或
所以我有一个简单的(仍然需要工作!)python/twisted 邮件服务器,它支持纯文本/TLS 邮件。我还刚刚使用 smtplib 编写了一个简单的客户端程序。 如果我使用 telnet 连接到我
我正在用 C++ 编写电子邮件客户端,使用 Winsock2 API 从 Gmail 帐户通过 SMTP 发送电子邮件。我没有使用任何其他第三方库。 我已经通过端口587(用于TLS)连接到Gmail
我正在尝试通过 log4j 发送错误电子邮件。通过使用以下附加程序:
这可能是一个重复的问题,但我仍然面临着这方面的问题,希望有解决方案。提前致谢。 我正在尝试通过公司的服务器发送邮件 我目前使用的是 Python 2.6 版和 Ubuntu 10.04 这是我得到的错
我正在使用我的 Gmail 帐户运行这个简单的示例,但它不起作用并出现以下错误: send failed, exception: com.sun.mail.smtp.SMTPSendFai
我正在尝试使用以下代码使用 sendmailR 包从 R 发送电子邮件,不幸的是失败了: ## Set mail contents from ', Sys.info()[4]) to ' subjec
在设置我的 session 时,我正在设置 starttls.enable 和 .required 属性,但是当连接发生时,它应该会根据文档失败: mail.smtp.starttls.enable
我正在尝试在sendmail中启动tls,但我不知道如何使用证书。请给我建议方法 > telnet localhost 25 Trying 127.0.0.1... Connected to loca
我尝试使用 STARTTLS 通过 php 和 swiftmailer 发送电子邮件,但收到证书错误。我拥有 SMTP 服务器的 root 访问权限,并且使用的证书是自签名的。我在两台机器上都使用 D
我尝试通过 postfix 通过 gmail 发送电子邮件,但它显示以下错误: 必须首先发出 STARTTLS 命令。 Sep 6 01:11:34 NovusTec postfix/smtp[10
我想实现 STARTTLS在 iOS 应用程序中,但我无法从文档中弄清楚如何去做。 到目前为止我有: 我使用 CFStreamCreatePairWithSocketToHost 创建套接字并打开流:
我是一名优秀的程序员,十分优秀!