2013-03-12 65 views
2

可以構建在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

回答

1

可以構建在iOS設備上運行的SSL/TLS服務器嗎?如果是,如何?

絕對。我在模擬器和設備上都使用了帶有SSL/TLS的CocoaHTTPServer用於測試目的。要使用客戶端證書,您需要進行一些修改,其中大部分都位於其GitHub問題列表中的patch

你可以在iOS上實時創建證書嗎?從來沒聽說過。

你能告訴SSL不使用證書嗎?嗯。即使你可以,使用SSL有什麼意義?這些證書是「保證」運輸的。 SSL是一種信任模式,鏈路兩端的各方評估另一方的信任。如果您正在動態創建證書,或者嘗試不使用證書期限,那麼您將使該信任模型失效 - 您無法獲取任何東西。

+0

感謝您的回答!如果我無法在iOS上創建證書,您會使用哪種證書?你是否在應用程序的包中嵌入了一個?但是由於應用程序分佈在App Store上,攻擊者是否可以推斷它並使用其中包含的私鑰解密傳輸? – Dev 2013-03-21 09:01:21

+1

是的,您必須自己創建一個並將其包含在您的應用程序中 - 是的,這意味着有人可以從應用程序包中恢復該證書。如果你這樣做,你會被詛咒的,如果你不這樣做,該死的。您可以在第一次運行時將證書放入應用程序的鑰匙串中,並將其保存在那裏,但無論證書來自何處,攻擊者都可以輕鬆獲取證書和密碼。 – quellish 2013-03-21 19:37:59

+0

但是,如果我用密碼保護證書?我可以從iOS讀取嗎? (很顯然,這意味着應用程序必須在二進制中隱藏密碼,但它仍然比沒有好!)PS我讀了CocoaHTTPServer的補丁[你已經鏈接](https://github.com/robbiehanson/CocoaHTTPServer/pull/26),但它似乎是指客戶端,我無法理解它在服務器端如何幫助我。 – Dev 2013-03-22 10:15:23

相關問題