我们有一个 Web 应用程序 (Apache/PHP),目前使用用户名/密码身份验证,目前可以从任何地方访问。它已启用服务器端 SSL。
我们的客户端程序是我们修改并重新命名的 FireFox 版本。此修改后的 Firefox 客户端仅用于连接到我们的 Web 应用程序服务器。用户必须使用此客户端程序才能连接到 Web 服务。
除了用户身份验证之外,我们还希望在服务器级别阻止任何未使用我们客户端程序的用户访问。因此,如果用户使用常规浏览器输入 URI,他们将被直接拒绝。
为了实现这一点,客户端程序需要向服务器表明自己的身份,以便服务器知道正在使用的是我们的客户程序,而不是网络浏览器或机器人。
*真正的目标是确保他们是我们公司的授权员工,然后才可以尝试登录,将这个“就业证明”嵌入到客户端程序中似乎是最简单的方法,因为该应用程序只提供给有需要使用它的人。
到目前为止,我对如何实现这一目标已经有了一些想法。
1.) 将一个令牌嵌入到客户端应用程序中,客户端登录时会发送令牌(登录由 chrome/XUL 接口处理)。这不会在服务器级别阻塞,只会在应用程序级别阻塞。密钥可能像密码一样容易被盗,但不容易被暴力破解,因为它可以是任意长度或复杂度。
1a.) 在所有请求的客户端浏览器标头中添加一个特殊的 tolken 参数。这更像是通过隐蔽性实现安全,但如果在请求中缺少魔法字符串的情况下登录总是失败(即使使用正确的密码),那么这肯定会减慢攻击者试图暴力破解密码的速度。
2.) 将客户端 SSL 证书嵌入到客户端程序中。这似乎是一个很好的解决方案,但几乎没有关于客户端 SSL 的良好文档。我们不想为每个用户签署证书,也不希望用户必须创建证书或被安全对话所困扰。私钥必须嵌入到浏览器中,并且是所有客户端程序共享的一个密钥,并在我们的自定义浏览器中按安装分发。
3.) 检查用户代理字符串。我认为 Apache 可以基于此进行限制。但这似乎充其量只是一种薄弱的措施。除了其他措施外,我可能会这样做。
我希望能有更好的想法来做到这一点?
答案1
在修改后的浏览器中包含客户端 SSL 证书会最简单,而且可能更安全。
如果对每个人都使用相同的密钥,您将失去客户端证书的许多优势,但这比检查用户代理要好。而且我假设您仍然需要用户名和密码才能登录。
答案2
您考虑过 VPN 吗?这听起来正是您真正想要的。