如何使用 Apache 进行客户端证书身份验证

Posted

技术标签:

【中文标题】如何使用 Apache 进行客户端证书身份验证【英文标题】:How to do client certificate authentication with Apache 【发布时间】:2014-08-23 23:28:58 【问题描述】:

这个问题很清楚,但我没有在网上找到任何有用的教程。所以我希望我能在这里碰碰运气。

基本上,我想使用 Apache 构建客户端证书身份验证。我为我托管的站点配置了 Apache 的 conf 文件。我放的conf在这里:

SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile /etc/apache2/ssl/client.crt

但是我不知道如何为客户端生成证书和密钥文件。另外,我应该在 Apache 服务器配置中的 SSLCACertificateFile 中放置什么文件?

服务器是否只是将客户端发送的证书文件与服务器上的证书文件进行比较?客户端证书认证到底在做什么?

【问题讨论】:

你跑题了,你的问题没有意义。如果您正在运行服务器,则不会为客户端生成任何内容。客户端生成自己的密钥和证书。如果他希望您对他进行身份验证,他也可以由您信任的 CA 对其进行签名,或者将其导出给您。 @EJP,这是不正确的:如果您有自己的 CA,客户端会生成密钥和证书请求,然后您会生成证书(使用证书请求和您的 CA)。然后,您可以检查用户是否使用由您的 CA“签名”的证书(和匹配密钥)进行连接。 【参考方案1】:

您可以在此处找到有关如何创建 CA 证书和由该 CA 证书签名的证书的说明: http://pages.cs.wisc.edu/~zmiller/ca-howto/

事情是这样的:

您设置了根 CA 密钥和证书 客户端生成他的私钥和证书请求 他们向您发送证书请求 您使用证书请求、根 CA 证书和根 CA 密钥生成证书 您将证书返回给客户端

然后您可以检查客户端是否提供了由 CA“签名”的证书。

【讨论】:

这很有道理,谢谢!验证过程中使用的密钥是什么? 那么客户端证书是否完全独立于服务器证书? 来自服务器证书(您在大多数 https 情况下使用的证书),是的。它仅链接到根 CA 证书。 @user3354832,当然,您也可以使用由您信任的其他人而不是您自己的 CA 生成的客户端证书。【参考方案2】:

了解 SSLVerifyClient 和其他指令很重要。 来自Practical Issues with TLS Client Certificate Authentication(第 3 页):

SSLVerifyClient 的默认值none 不需要CCA;因此服务器将不包括 TLS 握手中的 CertificateRequest 消息。

require 将需要 CCA,因此 CertificateRequest 消息将包含在 握手。如果客户端没有提供任何证书 客户端的证书消息或 mod_ssl 失败 验证提供的证书,TLS 握手将是 中止和致命的 TLS 警报消息将被发送到 客户。

optional 的值与 require 相同,但是 允许空客户端的证书消息。

最后一个可能的值 optional_no_ca 与 可选,但除此之外,它还允许客户端的证书是 提交的不链接到服务器信任的 CA (因为 OpenSSL [6] 中的错误尚未生效或已过期 非自签名客户端证书也将被接受)。

value optional_no_ca 可用于执行证书 在应用程序级别进行验证或实施 PKI-less 使用 X.509 证书作为公钥认证 公钥传输。

【讨论】:

以上是关于如何使用 Apache 进行客户端证书身份验证的主要内容,如果未能解决你的问题,请参考以下文章

智能卡如何用于客户端证书身份验证?

如何使用客户端证书在Web API中进行身份验证和授权

如何获取用于在我的 Rust Tonic 服务中进行身份验证的客户端证书?

Azure 中的客户端证书身份验证和 CA 证书

Apache https 客户端身份验证或重定向

为啥要使用证书对客户端进行身份验证?