在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是一种信任模式,链路两端的各方评估另一方的信任。如果您正在动态创建证书,或者尝试不使用证书期限,那么您将使该信任模型失效 - 您无法获取任何东西。
感谢您的回答!如果我无法在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