【问题标题】:SSL/TLS server running on an iOS device在 iOS 设备上运行的 SSL/TLS 服务器
【发布时间】:2013-03-12 14:18:36
【问题描述】:

是否可以构建在 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

【问题讨论】:

    标签: cocoa-touch encryption ssl cocoaasyncsocket


    【解决方案1】:

    是否可以构建在 iOS 设备上运行的 SSL/TLS 服务器?如果是,如何?

    当然。我在模拟器和设备上都将CocoaHTTPServer 与 SSL/TLS 一起用于测试目的。要使用客户端证书,您需要进行一些修改,其中大部分位于其 GitHub 问题列表中的 patch 中。

    您可以在 iOS 上即时创建证书吗?从来没听说过。

    你能告诉 SSL 不要使用证书吗?嗯。即使可以,使用 SSL 又有什么意义呢?证书是“保护”传输的东西。 SSL 是一种信任模型,链路两端的各方评估另一方的信任。如果您正在动态创建证书,或者试图不使用证书期限,那么您就是在使该信任模型无效 - 您并没有保护任何东西。

    【讨论】:

    • 感谢您的回答!如果我不能在 iOS 上创建证书,你会使用什么证书?您是否在应用程序包中嵌入了一个?但是由于该应用程序是在 App Store 上分发的,攻击者是否有可能使用其中包含的私钥对其进行推断并解密传输?
    • 是的,您必须自己创建一个并将其包含在您的应用程序中 - 是的,这确实意味着有人可以从应用程序包中恢复该证书。如果你这样做,你会被诅咒,如果你不这样做,你会被诅咒。您可以在第一次运行时将证书放在应用程序的钥匙串中并保留在那里,但无论证书必须来自某个地方,攻击者都可以轻松获取证书和密码。
    • 但是如果我用密码保护证书呢?我可以从 iOS 读取它吗? (显然这意味着应用程序必须在二进制中隐藏密码,但总比没有好!) PS 我读到 CocoaHTTPServer you have linked 的补丁,但它似乎指的是客户端,我不明白如何它可以在服务器端帮助我。
    • 如果你保护密码,是的。 CocoaHTTPServer 补丁用于客户端证书 SSL 身份验证 - 连接的双方都对其信任进行了验证。客户端和服务器都有用于验证对方的证书。因此,除了每个人都熟悉的客户端信任服务器之外,服务器还在评估客户端是否是他们所说的那个人。这使事情变得更加复杂,通常没有什么好处(但是,如果你想走那条路,那就是补丁)。开箱即用的 CocoaHTTPServer 不使用 SSL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    相关资源
    最近更新 更多