iPhone Web 服务通过证书身份验证调用 WCF 服务

Posted

技术标签:

【中文标题】iPhone Web 服务通过证书身份验证调用 WCF 服务【英文标题】:iPhone web service calls to WCF Service with Certificate Authentication 【发布时间】:2011-01-15 17:31:44 【问题描述】:

我们是一家已标准化 WCF 服务的 .Net 商店。我们正在开发一个 iPhone 应用程序,该应用程序需要进行安全的 Web 服务调用以获取应用程序的数据。为确保安全通信,我们在 Web 服务器上启用了 SSL。但这并不能确保该服务只能由授权的应用程序使用。我们已将我们的服务配置为支持 x509 证书身份验证。甚至可以从 iPhone 应用程序调用具有证书身份验证的安全 WCF 服务吗?

我花了很多时间在互联网上搜索示例,但无济于事。我已经能够成功调用不安全的 WCF 服务而没有任何问题。我还对 WS-Security 和 WS-Trust 通信标准进行了大量研究。我相信我理解这应该如何工作。我只是无法在 iPhone 框架中拼凑完成这项工作所需的步骤/对象。

任何关于这个主题的想法和想法都将不胜感激。

此外,对以下任何一项的任何想法:

    如何最好地使用 iPhone 应用程序部署 P12 证书文件 如何最好地保护应用内 P12 文件的密码 将 P12 文件与应用一起部署是一种最佳做法 iPhone 框架中是否有支持这种安全通信的设施?如果不是,那将是什么替代建议。

【问题讨论】:

这个问题有一些信息:***.com/questions/2244764/… Maike9,你在这方面有没有成功? 【参考方案1】:

对于初学者,我想说,如果您真的很重视安全性,请投入适当的时间和资源,并将其视为您功能列表中的一等公民。不要只是“打开 SSL”并假装事情是安全的。我并不是建议您这样做或不这样做,但我只是觉得在继续之前我必须说出来。

也就是说,您可能已经知道 WS-* 完全建立在 http 请求之上,并且任何时候您执行大量 http 请求时,您可能会发现ASIHTTPRequest 在 iPhone 上非常有用。但是,这不会让您 100% 到达那里。

从 iPhone 的角度来看,您有:

    URL loading system,它是用于处理任何类型的网络资源的高级 API CFNetwork C API 较低级别,可让您以任何您认为合适的方式更好地控制加密流和网络流量 负责繁重工作的Certificate, Key, and Trust Services,更具体地说是the X509 trust policies

在 Mac 上,您可以使用 Secure Transport,但据我所知,他们尚未将其移植到设备上,因此除非您打算将其带到桌面或只是有心情学习一切:)

如果您正在使用 WCF 进行任何安全操作,您可能首先意识到有 many options available to you,但这一切都归结为这个简短的列表:

    传输层安全 (https) 与明文消息 (xml/json/...) 开放传输 (http) 上的消息层安全性(加密的消息正文) 通过安全传输的安全消息

我上一次做 WCF 时(大约一年前),微软的一般建议似乎是开放传输上的消息层安全性,因为在尝试保护传输时引入了防火墙/可访问性问题。但是,这种方法假定所有相关方都具备 .NET/WCF 能力。我相信如果它是 HTTPS 传输级别的安全性,具有清晰的 XML 或 JSON 消息正文,那么在设备上使用会更容易。这样,您就可以利用 Apple 提供的 CFNetwork 和 NSHTTPRequest 中的所有功能。

一旦你得到一些工作,你会想要参考Enterprise Deployment Guide,特别是关于无线注册的文档,以便你可以在设备上安装证书。请记住,一切皆有可能,不要害怕使用程序附带的 Apple 支持票之一 :)

编辑:

我完全忘了提到GenericKeychain 和CryptoExcercise 的例子

编辑2:

在我无缘无故地被否决后,我重新阅读了我的回复,并意识到我在没有真正回答您关于如何在设备上打开 p12 文件的问题时说得太多了。您应该能够简单地[[UIApplication sharedApplication] openURL:urlToP12FileEitherLocalOrRemote]] 并将其启动到操作系统以进行安装过程。

【讨论】:

【参考方案2】:

您还可以在消息级别使用 ssl + 用户/通过身份验证。

【讨论】:

我们该怎么做呢?我是新手,请您详细解释一下吗? mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/…【参考方案3】:

一般来说,如果你想在 iPhone 上安装证书,我找到了两个选项(都来自here):

将证书通过电子邮件发送给收件人。如果它是一个有效的证书并且电子邮件中的标题是有序的,那么它将允许电子邮件的收件人安装证书。这里的问题当然是中间人攻击。

使用 iPhone 企业配置实用程序。

这应该可以帮助您实现(在本地安装证书)。我应该注意,一般来说,您不想为整个应用程序安装一个证书,而是为您的用户提供单独的证书。一般来说,验证应用程序是一件非常糟糕的事情,而您应该验证用户

但是,如果您已经在对用户进行身份验证,那么这应该不是问题,因为通过 HTTPS 使用基本身份验证同样有效(并且更易于编码)。

【讨论】:

您能否提供任何理由/链接来解释为什么对应用程序进行身份验证是一件非常糟糕的事情?我还想确保我的服务只能由授权的 APPS 使用,但任何在 iPhone 上安装了这些应用程序的用户都可以使用。【参考方案4】:

我也同意 Yaron Naveh 的解决方案,可能最好的选择是使用 SSL。我相信 SSL/TLS 加密在性能方面也比 WCF 中基于消息/XML 的加密更好。

我认为证书可能需要来自受信任的 CA(证书颁发机构)才能正常工作。根据记忆,我在使用带有自签名证书的 iPhone SDK 时遇到了困难,但这种情况很可能在去年发生了变化……

【讨论】:

【参考方案5】:

iPhone 应该能够访问受证书保护的 WCF 应用程序。如果您将 WCF 服务设为 Azure ACS 的 RP,则它应该可以使用 OAuth 以及其他方法。

查看此处的示例了解更多信息:http://acs.codeplex.com/

【讨论】:

以上是关于iPhone Web 服务通过证书身份验证调用 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

使用证书身份验证访问 Web 服务和 HTTP 接口

iPhone:HTTPS 客户端证书认证

使用 https 使用不同的 web 服务但只有一个使用证书身份验证后的 Axis2 问题

与 Web 服务的相互身份验证

REST Web 服务身份验证令牌实现

WCF与相互身份验证