可以構建在iOS設備上運行的SSL/TLS服務器嗎?如果是,如何?在iOS設備上運行的SSL/TLS服務器
我的疑惑與這些問題有關:在設備上,我可以隨時創建一個自簽名證書以便繼續使用嗎?或者我可以告訴SSL/TLS不要使用證書?
在我的iOS應用程序中,我使用的是AsyncSocket。該應用程序在同一時間都是客戶端和服務器。
的客戶端以這種方式實現的:
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port {
// Don't even validate the certificate chain
NSDictionary *settings = @{(NSString *)kCFStreamSSLValidatesCertificateChain : (id)kCFBooleanFalse};
[sock startTLS:settings];
}
- (void)onSocketDidSecure:(AsyncSocket *)sock {
// omitted: send the message...
}
的服務器端(其另一iOS設備上運行的)以這種方式實現的:
- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port {
// Don't even validate the certificate chain
NSDictionary *settings = @{(NSString *)kCFStreamSSLValidatesCertificateChain : (id)kCFBooleanFalse,
(NSString *)kCFStreamSSLIsServer : (id)kCFBooleanTrue};
[sock startTLS:settings];
}
- (void)onSocketDidSecure:(AsyncSocket *)sock {
// omitted: read the message...
}
但是,當客戶端嘗試連接到服務器時,會調用代理的方法onSocket:willDisconnectWithError:
,錯誤號爲Domain=kCFStreamErrorDomainSSL Code=-9848
。
感謝您的回答!如果我無法在iOS上創建證書,您會使用哪種證書?你是否在應用程序的包中嵌入了一個?但是由於應用程序分佈在App Store上,攻擊者是否可以推斷它並使用其中包含的私鑰解密傳輸? – Dev 2013-03-21 09:01:21
是的,您必須自己創建一個並將其包含在您的應用程序中 - 是的,這意味着有人可以從應用程序包中恢復該證書。如果你這樣做,你會被詛咒的,如果你不這樣做,該死的。您可以在第一次運行時將證書放入應用程序的鑰匙串中,並將其保存在那裏,但無論證書來自何處,攻擊者都可以輕鬆獲取證書和密碼。 – quellish 2013-03-21 19:37:59
但是,如果我用密碼保護證書?我可以從iOS讀取嗎? (很顯然,這意味着應用程序必須在二進制中隱藏密碼,但它仍然比沒有好!)PS我讀了CocoaHTTPServer的補丁[你已經鏈接](https://github.com/robbiehanson/CocoaHTTPServer/pull/26),但它似乎是指客戶端,我無法理解它在服務器端如何幫助我。 – Dev 2013-03-22 10:15:23