【发布时间】:2012-02-24 13:48:13
【问题描述】:
我们有一个只能由特定 Android 应用调用的网络服务。这个问题有什么解决方案?
要求是根本不使用身份验证。
【问题讨论】:
-
this 这样的东西怎么样?
我们有一个只能由特定 Android 应用调用的网络服务。这个问题有什么解决方案?
要求是根本不使用身份验证。
【问题讨论】:
如果只是您的客户端和服务器,您可以(并且应该)使用 SSL 而无需购买任何东西。您控制服务器和客户端,因此每个人都应该只信任一个证书,一个属于另一个证书,并且您不需要 CA。
这是高级方法。创建一个自签名服务器 SSL 证书并部署在您的 Web 服务器上。为此,您可以使用 Android SDK 中包含的 keytool。然后创建一个自签名客户端并将其部署在您的应用程序中作为资源包含在您的应用程序中的自定义密钥库中(keytool 也会生成它)。将服务器配置为要求客户端 SSL 身份验证并仅接受您生成的客户端证书。将客户端配置为使用该客户端证书来标识自己,并且只接受您在服务器上安装的一个服务器端证书。
一步一步的回答比这里保证的要长得多。我建议分阶段执行此操作,因为网络上有关于如何在服务器端和客户端处理 Android 中的自签名 SSL 证书的资源。我的书中还有一个完整的演练,Application Security for the Android Platform,由 O'Reilly 出版。
您通常将该证书/私钥存储在某种类型的密钥库中(如果您使用的是 Android,则为密钥库),并且该密钥库将被加密。该加密基于密码,因此您需要 (1) 将该密码存储在客户端中的某个位置,或者 (2) 在用户启动客户端应用程序时询问用户密码。您需要做什么取决于您的用例。如果 (2) 是可以接受的,那么您已经保护了您的凭证免受逆向工程,因为它将被加密并且密码不会存储在任何地方(但用户每次都需要输入)。如果您这样做 (1),那么有人将能够对您的客户端进行逆向工程、获取密码、获取密钥库、解密私钥和证书,并创建另一个能够连接到服务器的客户端。
您无法阻止这种情况发生;你可以使你的代码更难逆向工程(通过混淆等),但你不能让它变得不可能。您需要确定使用这些方法试图减轻的风险是什么,以及需要做多少工作来减轻风险。
【讨论】:
我想这将适用于适当的身份验证。我刚刚偶然发现的第一篇文章是这个: Securing communication from android to a web service 希望对你有帮助=)
【讨论】:
如果您绝对确定此 Web 服务只需要由授权的应用程序/设备访问,请使用客户端 SSL 证书并将服务器上的访问限制为仅具有授权证书的客户端。这具有始终强制 SSL 的额外功能,因此您不喜欢通过开放通道进行身份验证秘密。这是 Apache 的快速指南,但您也可以使用 nginx:
【讨论】: