【发布时间】:2018-10-20 22:33:18
【问题描述】:
我想通过使用 PHP/MySQL 的具有两个身份验证因素的 API 公开服务。一个因素是简单的用户名和密码。对于另一个因素,我尝试使用双向 TLS,其中客户端证书与用户名匹配。我打算使用我在带有 Apache 的 CentOS 机器上设置的 CA 的自签名证书,并通过安全通道向客户颁发客户端证书以及私钥。
我找到了一些关于如何使用 SSL 证书设置用户身份验证的不错的文章。到目前为止我发现的最好的如下。
https://cweiske.de/tagebuch/ssl-client-certificates.htm
但是,在向我解释某些事情方面,这篇文章和其他文章似乎存在漏洞。我对这项工作的设想是,当客户端发出 POST 请求以及用户名和密码时,还包括一个带有由颁发给用户的私钥签名的数字签名的证书。然后可以通过公钥解密此签名,以确认私钥的所有者发送了消息。但是,这些文章实际上并没有证实这就是正在发生的事情。
相反,他们说 Apache 确认证书是由 CA Cert 签署的。他们还解释了如何使用 PHP 访问证书中的字段,例如 SSL_CLIENT_S_DN_Email 和 SSL_CLIENT_M_SERIAL,并使用它们来确认证书属于消息的发送者。但是,我不清楚他们不只是使用公共证书中的信息。因此,任何可以访问公共证书的人都可以将其用作身份验证因素之一来对服务进行身份验证。如果是这样,这意味着它不是真正的身份验证因素。
我是否错误地认为我希望是这种情况 - 消息中包含的证书确实包含由颁发给用户的私钥签名的签名,并且 Apache 使用公钥解密签名而不是仅仅确认证书是由 CA 颁发的吗?
【问题讨论】:
标签: apache ssl certificate client