【问题标题】:Apache Client Certificates for Authentication用于身份验证的 Apache 客户端证书
【发布时间】: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


    【解决方案1】:

    有两点。

    在这种情况下(通过证书进行客户端身份验证),服务器要么维护其信任的证书列表,要么维护 CA 签署这些证书。服务器将检查所提供的证书是否属于这两种情况之一。

    至于提供的证书,不是任何人都可以提供任何证书,因为 TLS 交换将要求客户端使用相关的私钥做一些事情,因此服务器将能够验证客户端确实具有相关的私钥出示的公共证书。

    这在https://en.wikipedia.org/wiki/Transport_Layer_Security#Client-authenticated_TLS_handshake 有很好的解释,我在这里总结一下:

    1. 与我们的讨论无关的其他步骤
    2. 客户端响应一个证书消息,其中包含客户端的证书。
    3. ClientKeyExchange 步骤,我们可以跳过讨论
    4. 客户端发送一个 CertificateVerify 消息,该消息是使用客户端证书的私钥对先前握手消息的签名。可以使用客户端证书的公钥来验证此签名。这让服务器知道客户端可以访问证书的私钥,因此拥有证书。 所以在这里你看到客户端需要用它的私钥做一些事情,服务器将能够验证那个。

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

    【讨论】:

      【解决方案2】:

      配置 Apache 以允许相互身份验证非常简单,http://httpd.apache.org 上的文档非常清楚。基本上,您需要两个证书:一个安装在 Apache 服务器上的服务器证书,然后一个安装在您的 Firefox 浏览器或客户端应用程序或其他设备上的客户端证书。客户端证书必须由 Apache 服务器知道的 CA 之一颁发,才能成功进行身份验证。

      本项目https://github.com/amusarra/docker-apache-ssl-tls-mutual-authentication实现了Apache SSL/TLS Mutual Authentication的完整配置

      【讨论】:

        猜你喜欢
        • 2022-06-23
        • 2011-04-09
        • 2013-10-07
        • 1970-01-01
        • 2017-11-07
        • 2018-02-12
        • 1970-01-01
        • 2014-08-23
        • 2012-09-01
        相关资源
        最近更新 更多