我有一個簡單的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'嗎? –
我想你會想保留這行代碼 - 在服務器的連接端,保持原樣。但在客戶端,您需要在字典中將此值設置爲「NO」。 –