2016-09-28 2 views
2

enter image description here 방법을 사용하는 TLS 핸드 셰이크를 사용하여 피어 투 피어 통신을 암호화하려고했습니다. GCDAsyncSocket 라이브러리입니다. Bonjour 서비스는 서버에서 게시하고 클라이언트는 게시 된 호스트 이름에 연결합니다. 소켓 연결이 설정되면 아래 그림과 같이 서버에 대해 startTLS을 호출합니다.bonjour를 사용하는 GCDAsyncSocket 서비스 : startTLS가 TLS 핸드 셰이크를 시작합니다.

[settings setObject:[NSNumber numberWithBool:YES] 
      forKey:(NSString *)kCFStreamSSLIsServer]; 
[settings setObject:(__bridge id _Nonnull)(certs) 
      forKey:(NSString *)kCFStreamSSLCertificates]; 
CFRelease(certs); 
settings[GCDAsyncSocketSSLProtocolVersionMin] = [NSNumber numberWithInteger:8]; 

[connectedSockets addObject:newSocket]; 
[newSocket startTLS:settings]; 

아래의 클라이언트 측 설정은 내가 사용하고있는 설정입니다.

NSMutableDictionary *settings = [[NSMutableDictionary alloc] init]; 
    settings[GCDAsyncSocketSSLProtocolVersionMin] = [NSNumber numberWithInteger:4]; 
    settings[GCDAsyncSocketSSLProtocolVersionMax] = [NSNumber numberWithInteger:8]; 
    [settings setObject:[NSNumber numberWithBool:YES] 
       forKey:GCDAsyncSocketManuallyEvaluateTrust]; 
    [settings setObject:(__bridge id _Nonnull)(certs) 
       forKey:(NSString *)kCFStreamSSLCertificates]; 
    [sock startTLS:settings]; 

클라이언트와 서버간에이 핸드 셰이크가 시작된 후. wireshark의 도움으로이 두 가지 사이의 데이터 전송을 디버깅했습니다. 로그에서 핸드 셰이크가 TLS이 아닌 TCP 프로토콜에서 발생하고 있음을 보여줍니다. 핸드 셰이크가 TLSv1.2 프로토콜에서 발생해야합니다. 동일한 스크린 샷을 첨부합니다. 시체로 샘플 코드를 도울 수 있습니까?

+0

SSL/TLS와 핸드 쉐이크에 대해 읽어야합니다. 악수는 TLS 터널을 설정하는 데 필요한 것입니다. 그것은 열려있는 TCP 채널을 통해 이루어져야하며 다른 방법은 없습니다. TLS에서 핸드 셰이크를 수행하는 유일한 방법은 이미 설정된 TLS 터널에서 TLS를 시작하는 것입니다. – creker

+0

@creker 이제 TCP 프로토콜에서만 ssl 핸드 셰이크가 발생합니다. TLSv1.2 프로토콜이 언제 나타날지 알려주십시오. – Gyanendra

+0

성공적인 핸드 셰이크 후 – creker

답변

0

문제점을 파악할 수있었습니다. wireshark에 문제가있었습니다. wireshark에서 보안 포트는 443이지만 Bonjour 서비스의 경우 포트가 로컬이므로 예 12120에 대한 bonjour 서비스의 포트를 하드 코드하고 bonjour 서비스를 게시했습니다.

wireshark 편집 -> 환경 설정 -> 프로토콜 -> HTTP에서이 wireshark가 TLSv1.2에서 클라이언트 hello 및 server hello 등의 적절한 로그를 표시 한 후 보안 포트를 12120으로 변경했습니다. 지원해 주셔서 감사합니다.

관련 문제