간단한 TCP 서버/클라이언트 설정이 있습니다. 이 연결은 실제로 잘 작동합니다.SSL/TLS를 지원하는 Objective-C TCP 서버
이제 소켓 연결에 SSL/TLS 암호화를 구현하고 싶습니다. 키 체인 액세스를 사용하여 PKCS12 인증서를 만들었습니다.
NSString *certificatePath = [[NSBundle mainBundle] pathForResource:@"TCPServerCertificate" ofType:@"p12"];
NSData *certificateData = [NSData dataWithContentsOfFile:certificatePath];
CFArrayRef keyRef;
OSStatus status = SecPKCS12Import((__bridge CFDataRef)certificateData, (__bridge CFDictionaryRef)@{(__bridge NSString *)kSecImportExportPassphrase: @"1234"}, &keyRef);
if (status != noErr) {
NSLog(@"PKCS12 import error %i", status);
return;
}
CFDictionaryRef identityDict = CFArrayGetValueAtIndex(keyRef, 0);
SecIdentityRef identityRef = (SecIdentityRef)CFDictionaryGetValue(identityDict, kSecImportItemIdentity);
SecCertificateRef certificate;
status = SecIdentityCopyCertificate(identityRef, &certificate);
if (status != noErr) {
NSLog(@"sec identity copy failed: %i", status);
return;
}
NSArray *certificates = [NSArray arrayWithObjects:(__bridge id)identityRef, (__bridge id)certificate, nil];
NSDictionary *settings = @{(NSString *)kCFStreamPropertyShouldCloseNativeSocket: [NSNumber numberWithBool:YES],
(NSString *)kCFStreamSSLValidatesCertificateChain: [NSNumber numberWithBool:YES],
(NSString *)kCFStreamSSLAllowsExpiredCertificates: [NSNumber numberWithBool:NO],
(NSString *)kCFStreamSSLAllowsExpiredRoots: [NSNumber numberWithBool:NO],
(NSString *)kCFStreamSSLAllowsAnyRoot: [NSNumber numberWithBool:YES],
(NSString *)kCFStreamSSLCertificates: certificates,
(NSString *)kCFStreamSSLIsServer: [NSNumber numberWithBool:YES],
(NSString *)kCFStreamSSLLevel: (NSString *)kCFStreamSocketSecurityLevelTLSv1};
CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);
가 그럼 난 스트림의
NSStream
인스턴스를 생성하고 다른 클래스에서 그들을 처리 : 내 서버에서 나는 동의 콜백 내부에 다음과 같은 코드가 있습니다.
서버를 실행하고 클라이언트를 연결할 때 일반 위임 NSStreamEventOpenCompleted
이 표시됩니다. 그때 난 그냥 연결을 닫으면 스트림 또는 이벤트에 쓸 때, 나는 다음과 같은 오류가 받고 있어요 :
2013-10-25 13:27:08.584 TCPServer[6435:303] CFNetwork SSLHandshake failed (-9800)
2013-10-25 13:27:08.584 TCPServer[6435:303] NSStreamEventOpenCompleted
2013-10-25 13:27:08.585 TCPServer[6435:303] NSStreamEventErrorOccurred
은 내가 클라이언트 측에서 구현해야하는지 궁금. 또한 왜 데이터를 전송하거나 클라이언트 측에서 연결을 끊을 때 핸드 셰이크 실패가 발생하는지 궁금합니다. 이 오류가 발생할 때마다 클라이언트는 연결되어 있다고 생각합니다.
좋은 TCP SSL/TLS 자습서 또는 클라이언트와 서버 측면 모두를 다루는 다른 자료가 있습니까?
이 동일한 코드를 사용하고 연결의 양쪽 끝에? 그렇다면, 연결의 양쪽에서'kCFStreamSSLIsServer' 속성을'YES'로 설정하는 것처럼 보입니다. –
나는 지금 사무실에 없다. 그러나 그것이 옳을 수도 있습니다. 'kCFStreamSSLIsServer'를 제거해야합니까? –
나는이 코드 줄을 유지하고 싶다고 생각한다. 서버 연결의 측면에서 그대로 둔다. 그러나 클라이언트 측에서는이 값을 사전에 '아니오'로 설정하려고합니다. –