首页 文章

用于身份验证的Apache客户端证书

提问于
浏览
0

我想通过API使用PHP / MySQL通过两个身份验证因素公开服务 . 一个因素是简单的用户名和密码 . 对于另一个因素,我试图使用相互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?

1 回答

  • 0

    有两点 .

    在这种情况下(通过证书进行客户端身份验证),服务器要么维护它信任的证书列表,要么CA签署这些证书 . 服务器将检查证书是否出现在这两种情况之一中 .

    至于所提供的证书,任何人都不能提供任何证书,因为TLS交换将强制客户端使用相关私钥做某事,因此服务器将能够验证客户端确实具有公共证书的相关私钥 . 呈现 .

    这在以下内容中得到了很好的解释:https://en.wikipedia.org/wiki/Transport_Layer_Security#Client-authenticated_TLS_handshake,我在此总结:

    • 与我们的讨论无关的其他步骤

    • 客户端使用证书消息进行响应,该消息包含客户端的证书 .

    • ClientKeyExchange步骤,我们可以在讨论中跳过

    • 客户端使用客户端's certificate'私钥发送CertificateVerify消息,该消息是先前握手消息的签名 . 可以使用客户端's certificate'的公钥来验证此签名 . 这使服务器知道客户端可以访问证书的私钥,从而拥有证书 . 所以在这里你看到客户端需要用它的私钥做一些事情,服务器将能够验证这一点 .

    当然,只有当您过滤最终客户端证书时,这一切才有效:如果您允许其中任何一个,任何人都可以创建一个具有任何可用的标识 .

相关问题