在iOS设备上运行的SSL/TLS服务器

问题描述:

可以构建在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设备上运行的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