我正在为移动应用程序构建一个带有面向公共的HTTP端点的后端。尽管这个端点是公开可见的,但它只供我的应用程序使用,也就是说,我不希望人们使用wget或任何类似的方式向其发送随机请求。
我的想法是在我的服务器上配置一个SSL/TLS,从而使API只在HTTPS上可用,并在服务器上强制执行客户端证书检查。该应用程序的每一份副本都会有(相同的)客户端证书捆绑在一起。
请注意,我这样做并不是为了进行用户身份验证,只是为了限制来自我的应用程序以外的其他来源的访问。
是一个有效的解决方案吗?它很吸引我,因为它是如此简单。有什么明显的缺陷吗?证书被从应用程序中解压缩并用于恶意目的的可能性有多大?
发布于 2014-07-21 12:46:33
我不希望人们使用wget或任何类似的方式向其发送随机请求。...应用程序的每个副本都会有(相同的)客户端证书捆绑在一起。
好吧,这不是个好主意。恐怕行不通。粗略总结:如果一个秘密值被复制到两个以上的地方,那么它就不再是一个秘密了。在这种情况下,如果有些人对“使用wget发送随机请求”感兴趣,那么他们只需从应用程序的任何副本中提取证书和私钥,这是一场微不足道的逆向工程。
想想看:如果在一个被广泛复制的应用程序中隐藏一个秘密值是有效的,那么就不会有可能撕掉DVD。一想到基于软件的盗版,音乐编辑就不会哀叹和咬牙切齿。在网络游戏中不会有作弊。
用来描述这种情况的常用的捕获短语是:客户端强制的安全性不起作用。
不过,要注意上下文。从使用该密钥的已编译应用程序中提取私钥并不困难;但是,这并不意味着人们会这样做。冷漠是计算机世界中最强大的力量之一。这样的逆向工程只有在某人在某个地方有足够的动力投入他几个小时的时间(最多是)在这项任务上时才会发生。这可能发生,只有当有任何收获,实际上,“发送随机的wget请求”到您的服务器。
许多薄弱的系统,甚至试图加强客户端安全的应用程序,都没有受到攻击,仅仅是因为没有人愿意这样做。
发布于 2015-03-04 16:44:59
这种方法作为安全控制很弱,不增加身份验证值。其他评论者认为,嵌入在应用程序中的证书很容易被恶意参与者提取,这是正确的。然而,有一种安全的方法可以做到这一点。
您的目标是将服务器API接口隐藏在需要相互身份验证的TLS连接后面,以防止它在网络中被发现和潜在攻击,这是合理的,强烈建议您这样做。不幸的是,正确地这样做的开销对于不需要强大安全性的用例来说太大了。
客户端证书必须发给每个用户.要做到这一点,你必须有适当的PKI组件面对互联网,或被承包给一个有这种能力的人。您的许可和应用程序安装必须包括一个进程,让用户向CA注册并接收唯一的证书,然后应用程序(使用OS加密的证书存储库或其他安全手段)存储该证书,并按照您的设想使用在应用程序中分发的证书用于TLS身份验证。
此外,您可能需要考虑管理证书吊销,您的web服务器需要在完成TLS握手之前检查证书吊销,作为验证证书的一部分。例如,如果您的客户正在为服务支付每月费用,并且您签发的证书有效期为1年,则您可能应该撤销不再收到您的服务但谁的证书尚未过期的客户的证书。
大型企业正为此和类似的目的使用证书。他们可以很容易地站起来CA和他们的管理,并在许多用例中证明成本是合理的,包括以这种方式保护互联网发布的服务。
发布于 2014-07-19 07:19:58
您的身份验证解决方案很好,因为它是基于相互身份验证的。
如果您正在使用Apache,则可以通过在配置中添加以下行来轻松实现(在设置CA和客户端密钥材料之后):
SSLVerifyClient require为了保护您在手机上的关键材料,您需要以安全的方式存储您的密钥和证书。
在iOS中,密钥链将是一个合适的位置,或者类似于安卓中的keystore。
如果一个密钥丢失了,您仍然可以将其放到吊销列表(CRL)中。
https://security.stackexchange.com/questions/63462
复制相似问题