【问题标题】:Getting started with client certificates and PHP客户端证书和 PHP 入门
【发布时间】:2012-08-14 20:12:19
【问题描述】:

我是我部门内部网站的项目经理,我正在尝试为该网站设置用户名/密码身份验证的替代方法。我的印象是,理想的方法是在每个授权设备上使用 SSL 客户端证书来实现这一点,但是在尝试消化了几天的信息甚至购买了一本关于 OpenSSL 的书之后,我什至不知道如何开始。

设置的要点如下:

  • 在 IIS 6 上运行的网站
  • 安装了 OpenSSL 模块的 PHP 5.2
  • Windows Server 2003
  • 登录设备包括 Windows XP/Windows 7 PC 和 Blackberry 设备
  • 有效的 CA 签名 SSL 证书当前安装在服务器上并需要连接

我想做的是从连接设备请求客户端证书;如果不可用,请为 LDAP 身份验证请求用户名和密码(目前正在运行)。一旦通过身份验证,我希望用户能够生成和下载客户端证书,以便在设备上安装以连接到该服务器,而无需使用用户名/密码组合。

我知道我可以使用 cookie 进行相同类型的“自动登录”,但我认为使用这种方法可以增强安全性,尽管配置更加繁琐。

我希望这里的某个人可以为我指明正确的方向以开始这样的事情,或者告诉我是否完全朝着错误的方向前进以完成此任务。我确信我的理解存在很多差距,但是到目前为止我读过的每个教程要么过于笼统而无用,要么跳入了一定程度的复杂性,在我得到之前我已经无法理解了不止几行。

提前感谢您可以分享的任何建议!

【问题讨论】:

  • 客户端证书是指自签名 SSL 证书吗?或者只是用于传输的 AES 256 加密密钥文件?自签名 SSL 证书在大多数(如果不是全部)浏览器中都会出现问题,因为自签名证书不是有效的身份验证方法,而是完全验证证书。
  • 如果安全很重要,那么您确实希望使用比 5.2 更新的 PHP 版本。如果不再受支持的 PHP 版本中的已知错误绕过任何安全措施,那么任何安全措施都将化为乌有。
  • 今年秋天我们将升级到 5.2 以上;我尝试升级到 5.3/5.4,但 SQL Server 驱动程序或 FastCGI 或两者都有问题,这取决于我尝试与 IIS6 一起迁移到的版本,但我们将在下个月升级整个服务器包或二。
  • 这听起来很狡猾,我的意思是你正在交易一个可能被盗并且可能很容易被盗的(客户端计算机在不安全的网络上,客户端计算机不安全)来代替对用户凭据的静态要求。我只是不知道您打算如何保护这种类型的登录,我个人也无法想到,因为您将依赖链中最薄弱部分的安全性,即客户端机器/设备。
  • 感谢您就使用用户证书自动登录相关网站的适用性提出的集体建议。但是,还有许多其他层可以保护登录凭据的安全性。首先,政策要求每个用户都有一个强密码才能登录计算机或黑莓,以便访问设备,这已经使用户可以通过 AD 访问网站导航的文件结构以及网站解析以供显示的数据库。所以添加另一个密码不会增加......

标签: php iis ssl client-certificates


【解决方案1】:

我想我会把这个作为我的答案,因为我越读你的问题,我就越认为这是我的答案。

我绝对不会这样做。为了允许 AES 加密的“证书”或密钥文件克服正常的身份验证过程,您需要要求一件事的信任和完整性:客户端机器/设备。

这是不可能的,您永远不应依赖客户机器的安全性或安全性以及您在他们机器上的数据。如果用户没有在每个站点的浏览器自己的密码数据库中设置“记住我的密码”,那么物理密码比计算机上的物理文件更难窃取。这就是为什么大多数物理密码都是通过窃取网站数据库来获取的。当然,如果您知道自己的东西,您可以信任自己的编码和散列函数来提供您拥有的最佳安全性,比客户端计算机更安全。如果客户证书被盗,就没有办法知道它是否有,我同意密码也是如此,但正如我上面所说,密码更难获得,即使你拥有公司数据库如果正确完成哈希,破解哈希仍然要困难得多。

我想为了提高安全性,你可以说每个文件都应该限制在一个 IP 上,但这会破坏绕过身份验证过程的意义,因为如果你考虑一下,你的大多数用户将使用从他们的 ISP。我知道我的 ISP 每半夜都会更改我的 IP,这意味着该文件将不再每天都有效,这意味着我每天都必须使用我的用户名和密码重新登录。

这至少是一场安全噩梦。您的用户帐户将只是等待被黑客入侵,并且只是您的身份验证过程之上不需要的膨胀软件。

但是,对于您的严格控制(如果是严格控制,即使通过大规模身份验证,个人可以从外部访问的任何东西都不会受到严格保护)Intranet,我将使用 PHP 生成我的证书文件,使用:http://php.net/manual/en/function.openssl-csr-sign.php

现在这里的关键是您需要将该证书存储在您身边,以便您对其进行评估。为此,您需要使用一些解析函数:http://www.php.net/manual/en/function.openssl-x509-parse.php 在您获得的客户端证书上。

但是 cURL 有自己的客户端 SSL 处理程序,请看这里:

Client Certificates with LibCUrl

希望这会有所帮助,

【讨论】:

  • 请看我上面的解释。在公共环境中,我倾向于同意你的观点,但我正在开发一个严格控制的 Intranet,它已经需要 AD 身份验证或 Blackberry 身份验证才能访问相关设备,这意味着用户必须重复登录才能获得访问他们已经可以访问网站之外的资源。
  • @Strikefinder 好的,我想我可能有一些可以提供帮助的东西,编辑了答案。
猜你喜欢
  • 1970-01-01
  • 2010-10-16
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
相关资源
最近更新 更多