0

내 Ejabbered 서버가 SSL 및 TLSv1.1/1.2를 사용하여 안전하며 다음 오류 코드를받는 서버에 클라이언트를 연결하려고하는 채팅 앱을 작성 중입니다.IOS에서 보안 Ejabbered 서버를 사용하여 XMPP 클라이언트에 연결하는 방법은 무엇입니까?

Error Domain=GCDAsyncSocketErrorDomain Code=7 "Socket closed by remote peer" UserInfo={NSLocalizedDescription=Socket closed by remote peer. 

필수 설정 AppDelegate에 (Setupstream)에서 그 후

[email protected]""; // hostname 
_xmppStream.hostPort=5223; // 5223 for secure SSL connection 
_xmppStream.startTLSPolicy = XMPPStreamStartTLSPolicyRequired; 
    customCertEvaluation = YES; 

수동 completionHandler에서 클라이언트 서버 인증서와 일치하는 그 후 사용자 지정 인증서 유효성 검사를

- (void)xmppStream:(XMPPStream *)sender willSecureWithSettings: 
    (NSMutableDictionary *)settings{ 
    NSString *expectedCertName = [_xmppStream.myJID domain]; 

    if (expectedCertName){ 
    [settings setObject:expectedCertName forKey:(NSString *)kCFStreamSSLPeerName]; 
    } 
    if (customCertEvaluation){ 
    [settings setObject:@(YES)forKey:GCDAsyncSocketManuallyEvaluateTrust]; 
    } 

을 신뢰합니다.

-(void)xmppStream:(XMPPStream *)sender didReceiveTrust:(SecTrustRef)trust 
     completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler{ 

    SecCertificateRef certificate=SecTrustGetCertificateAtIndex(trust, 0); 
    NSLog(@"serverCertificate :%@",certificate); 
    NSData *certData1=(__bridge NSData *)SecCertificateCopyData(certificate); 

    // Get our certificate 
    NSString *cer = [NSString stringWithFormat:@"%@", [[NSBundle mainBundle] pathForResource:@"ca" ofType:@"crt"]]; 
    NSData *certData2 = [[NSData alloc] initWithContentsOfFile:cer]; 

    OSStatus status = -1; 
    SecTrustResultType result = kSecTrustResultDeny; 

    if(certData1 && certData2){ 
    SecCertificateRef cert1; 
    cert1 = SecCertificateCreateWithData(NULL, (__bridge CFDataRef) certData1); 

    SecCertificateRef cert2; 
    cert2 = SecCertificateCreateWithData(NULL, (__bridge CFDataRef) certData2); 

    const void *ref[] = {cert1, cert2}; 
    CFArrayRef ary = CFArrayCreate(NULL, ref, 2, NULL); 

    SecTrustSetAnchorCertificates(trust, ary); 
    status = SecTrustEvaluate(trust, &result); 
    } 
    else{ 
     NSLog(@"local certificates could not be loaded"); 
     completionHandler(NO); 
     } 

if ((status == noErr && (result == kSecTrustResultProceed || result == kSecTrustResultUnspecified))){ 
     completionHandler(YES); 
     NSLog(@"Certificate match"); 
    } 
else{ 
    arrayRefTrust = SecTrustCopyProperties(trust); 
    NSLog(@"error in connection occured\n%@", arrayRefTrust); 
    completionHandler(NO); 
    NSLog(@"Certificate not match"); 
    } 
    } 

GCDAsyncSocket.m/이 사용되지 않는 방법을 사용하여

답변

0

시도 :

[self.xmppStream oldSchoolSecureConnectWithTimeout:60.f error:&connectionError]

은 또한 당신이 제대로 호스트 이름을 설정되어 있는지 확인합니다 접두어로 사용 https없이

[self.xmppStream setHostName:@"yourhostname.com"].

대신 현재 사용되지 않는 연결 방법을 사용하지 않고 작업하는 동안이 해결 방법을 사용하고 있습니다.