ios - 인증서 - 멀티패스 tcp



iOS 11에서 TCP 기반 클라이언트 통신이 작동하지 않습니까? (1)

App Transport Security (ATS)인지 궁금합니다. https://www.nowsecure.com/blog/2017/08/31/security-analysts-guide-nsapptransportsecurity-nsallowsarbitraryloads-app-transport-security-ats-exceptions/

iOS 11 ATS 업데이트의 경우 일부 ATS 업데이트가 일부 예정되어 있습니다.

  • TLSv1.3은 예비 지원을받을 것입니다.
  • 승인 된 암호 목록에서 3DES가 ​​제거됩니다.
  • SHA1로 서명 된 인증서는 더 이상 승인되지 않습니다.
  • RSA 키로 서명 된 인증서는 2048 비트 이상의 키 길이를 가져야합니다.

PLIST 및 인 타이틀먼트는 앱에서 사용하고 있습니까?

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>

        <key>creativecommons.org</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>

        <key>localhost</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>

    </dict>
</dict>

ATS를 사용하지 않으려면 다음을 사용할 수도 있습니다.

<key>NSAppTransportSecurity</key>  
 <dict>  
      <key>NSAllowsArbitraryLoads</key><true/>  
 </dict>

그러나 이것은 권장하지 않습니다!

소켓 프로그래밍 을 사용하여 장치와 통신하는 IoT 응용 프로그램이 있습니다. iOS 11이 출시 될 때까지 모두 좋습니다. iOS 11 이상에서는 통신하지 않지만 이전 버전 (최대 10 개)에서는 작동합니다. 여기에 코드가 있습니다.

소켓 연결 설정

(void)setUpSocketConnection {
    @try {
        CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (__bridge CFStringRef) VeranoHost,VeranoPort , &readStream, &writeStream);
        [self open];
    }
    @catch (NSException *exception) {
        NSLog(@"Open Exception:%@", exception.reason);
    }   
}

스트림 열기

(void)open {
    //NSLog(@"Opening streams.");
    _outputStream = (__bridge  NSOutputStream *)writeStream;
    _inputStream = (__bridge  NSInputStream *)readStream;
    [_outputStream setDelegate:self];
    [_inputStream setDelegate:self];

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);
    dispatch_async(queue, ^ {
            [_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            [_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            [[NSRunLoop currentRunLoop] run];
    });

    [_outputStream open];
    [_inputStream open];

    //[self disableNaglesAlgorithmForStream:_inputStream];
   // NSLog(@"Connected");
//    self.timeOutTimer = [NSTimer scheduledTimerWithTimeInterval:10.0
//                                                         target:self
//                                                       selector:@selector(timerTimeOutAction:)
//                                                       userInfo:nil
//                                                        repeats:NO];
}

출력 스트림에 쓰기

(void)writeData:(NSString *)message forSocketType:(SOCKETTTYPE)socketType {
    self.socketType = socketType;
    NSData *data = [[NSData alloc] initWithData:[message dataUsingEncoding:NSASCIIStringEncoding]];
    [_outputStream write:[data bytes] maxLength:[data length]];
    [_outputStream close];

}

이벤트 핸들러

(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
   // NSLog(@"stream event %lu", (unsigned long)streamEvent);
    switch (streamEvent) {
        case NSStreamEventOpenCompleted:{

           // NSLog(@"NSStreamEventOpenCompleted :::: Stream opened and connected");
        }
            break;
        case NSStreamEventHasBytesAvailable:
            // NSLog(@"NSStreamEventHasBytesAvailable :::: Stream opened and connected");
            if (theStream == _inputStream) {
                uint8_t buffer[1024];
                NSInteger len;

                while ([_inputStream hasBytesAvailable])
                {
                    len = [_inputStream read:buffer maxLength:sizeof(buffer)];
                    if (len > 0)
                    {
                        NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];

                        if (nil != output)
                        {
                            NSLog(@"server said: %@", output);
                            [self messageReceived:output];
                        }
                    }
                }
            }
            break;
        case NSStreamEventHasSpaceAvailable:
           // NSLog(@"NSStreamEventHasSpaceAvailable :::: Stream has space available now");
            break;

        case NSStreamEventErrorOccurred:{
           NSError *theError = [theStream streamError];
            NSLog(@"Error Description:%@",theError.localizedDescription);
            [self close];
            if(self.delegate &&[self.delegate respondsToSelector:@selector(socketHandlerItem:failureWithError:forSocketType:)]){
                [self.delegate socketHandlerItem:self failureWithError:[theStream streamError] forSocketType:self.socketType];
            }
             //NSLog(@"NSStreamEventErrorOccurred :::: %@",[theStream streamError].localizedDescription);
        }
            break;

        case NSStreamEventEndEncountered:
            [theStream close];
            [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            if(self.delegate &&[self.delegate respondsToSelector:@selector(socketHandlerItem:eventStopedWithstatus:forSocketType:)]){
                [self.delegate socketHandlerItem:self eventStopedWithstatus:YES forSocketType:self.socketType];
            }
           // NSLog(@"NSStreamEventEndEncountered :::: close stream Disconnected");
            break;
        default:
           // NSLog(@"Unknown event");
            break;
    }
}

따라서 소켓에 연결하면 이벤트 처리기의 NSStreamEventErrorOccurred 에 입력되고 기록됩니다 - The operation couldn't be completed. No route to host The operation couldn't be completed. No route to host

어떤 도움이라도 대단히 감사하겠습니다.

2017 년 12 월 19 일 업데이트

  • 호스트 주소를 검색 할 수있는 Reachability 래퍼가 있으며 NetworkStatus ReachableViaWiFi 반환하는지 확인할 수 있습니다.
  • 소켓 통신은 정상적으로 작동하며 데이터를 보내고받을 수있는 샘플 서버 소켓을 만들어 보았습니다.

업데이트 2017 년 12 월 20 일 (1)

IoT 장치 세부 정보 - USR-WIFI232-S 저전력 WiFi 모듈

사용 설명서

업데이트 2017 년 12 월 20 일 (2)

유레카하지만 솔루션은 실시간으로 적용 할 수 없습니다. IoT 모듈의 호스트 주소에 해당하는 iOS 11에서 가장 가까운 고정 IP 주소 범위를 설정하는 동안 통신은 정상적으로 작동합니다. 동적으로 할당 된 IP 주소에서는 작동하지 않습니다.





iot