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


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

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

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

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

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


7115
2017-07-03 01:21


起源

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


答案:


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

事情是这样的:

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

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


11
2017-07-03 01:34



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


了解SSLVerifyClient和其他指令非常重要。 从 TLS客户端证书的实际问题 认证 (第3页):

默认值 没有 SSLVerifyClient的功能   不要求CCA;因此服务器不会包含   TLS握手中的CertificateRequest消息。

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

价值 可选的 是相同的 要求但是   将容忍空客户端的证书消息。

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

该   值 optional_no_ca 可用于执行证书   在应用程序级别进行验证或实施PKI   使用X.509证书的公钥验证   公钥运输。


1
2018-05-10 11:50