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

21

问题非常清晰,但我在网上没有找到任何有用的教程。所以我希望我能在这里得到一些帮助。

基本上,我想要使用Apache构建客户端证书认证。我为我托管的站点配置了Apache的conf文件。我放置的conf如下:

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

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

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


你的问题不是很相关,也不太有意义。如果你在运行服务器,那么你不需要为客户端生成任何东西。客户端会自己生成密钥和证书。如果他想让你对他进行身份验证,那么他需要自己去获取一个由你信任的CA签名的证书,或者将证书导出给你。 - user207421
5
@EJP,这是不正确的:如果你有自己的CA,客户端会生成一个密钥和证书请求,然后你会生成一个证书(使用证书请求和你的CA)。然后你可以检查用户连接是否使用了由你的CA“签名”的证书(和匹配的密钥)。 - jcaron
2个回答

16
您将在此处找到如何创建CA证书以及由此CA证书签名的证书的说明: http://pages.cs.wisc.edu/~zmiller/ca-howto/ 操作步骤如下:
  • 设置根CA密钥和证书
  • 客户端生成私钥和证书请求
  • 他们向您发送证书请求
  • 您使用证书请求、根CA证书和根CA密钥生成证书
  • 您将证书返回给客户端
然后,您可以检查客户端是否提供了由CA“签名”的证书。

这非常有道理,谢谢!另外,在验证过程中密钥的作用是什么? - user3354832
客户端证书与服务器证书完全独立吗? - user3354832
从服务器证书(在大多数https情况下使用的证书)来看,是的。它仅与根CA证书相关联。 - jcaron
2
@user3354832,当然,您也可以使用由您信任的其他人生成的客户端证书,而不是您自己的CA。 - jcaron

4
重要的是要理解SSLVerifyClient和其他指令。 来自《TLS客户端证书认证的实际问题》(第3页):https://eprint.iacr.org/2013/538.pdf SSLVerifyClient的默认值为none,不需要客户端证书验证;因此服务器在TLS握手中不会包括CertificateRequest消息。
require将需要客户端证书验证,因此CertificateRequest消息将包括在握手中。如果客户端没有在客户端证书消息中提供任何证书或mod_ssl未能验证所提供的证书,则TLS握手将被中止,并向客户端发送致命的TLS警报消息。
optionalrequire相同,但将容忍空的客户端证书消息。
最后一个可能的值optional_no_ca与可选项相同,但另外允许提交不链到服务器信任的CA的客户端证书(由于OpenSSL中的错误[6],尚未有效或过期的非自签名客户端证书也将被接受)。
optional_no_ca可用于在应用程序级别执行证书验证或实现无PKI的公钥身份验证,该身份验证使用X.509证书作为公钥传输。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接