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