浏览器不要求客户端证书

浏览器不要求客户端证书

我正在配置 Apache 以使用客户端证书身份验证。但是,当我浏览该站点时,它不会要求我提供证书,除非指定了 SSLCACertificateFile。然后它将通过浏览器请求证书。浏览器将弹出一个框,要求我选择证书(它仅显示由 SSLCACertificateFile 指定的 CA 签名的证书)。

我正在使用自签名证书。

“客户端”使用的证书是否在 SSLCACertificatePath 中指定也无关紧要。

关于为什么会出现这种情况,有什么有用的建议吗?除非指定 SSLCACertificateFile,否则浏览器不要求证书是正常的吗?

<VirtualHost _default_:443>
DocumentRoot "C:/documents"
ServerName server.ip:443
ServerAdmin [email protected]
ErrorLog "C:/Apache2.2/logs/error.log"
TransferLog "C:/Apache2.2/logs/access.log"

SSLEngine on
SSLCipherSuite HIGH:MEDIUM

SSLCertificateFile C:/Apache2.2/certs/server.crt

SSLCertificateKeyFile C:/Apache2.2/certs/server.key

SSLCertificateChainFile C:/Apache2.2/certs/ca.crt

SSLCACertificateFile C:/Apache2.2/certs/ca.crt

SSLCACertificatePath C:/Apache2.2/allowed-crts

SSLCARevocationPath C:/Apache2.2/revoked-certs

SSLVerifyClient require
SSLVerifyDepth  2

SSLOptions +ExportCertData +StdEnvVars
<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "C:/Apache2.2/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

BrowserMatch ".*MSIE.*" \
     nokeepalive ssl-unclean-shutdown \
     downgrade-1.0 force-response-1.0

CustomLog "C:/Apache2.2/logs/webservices-ssl_request.log" \
      "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

答案1

你说的确实有道理,文档,虽然有点模糊,但似乎同意。

SSLCA证书文件

该指令规定一体你可以在这个文件中收集证书颁发机构 (CA) 的证书,客户您处理的证书文件。这些证书文件用于客户端身份验证。此类文件只是按优先顺序连接各种 PEM 编码的证书文件。这可以作为 SSLCACertificatePath 的替代和/或补充使用。

只是为了澄清一下,我的理解是,这SSLCACertificateFile是必要的,以便服务器知道哪些客户端被允许进入受保护区域,并且您至少需要SSLCACertificateFileSSLCACertificatePath

答案2

当使用自签名证书时,我发现放弃 CA 业务并SSLVerifyClient optional_no_ca结合使用会更容易SSLRequire

    DocumentRoot /srv/www/1
ServerName your.server.tld
SSLCertificateFile /etc/apache2/ssl/your.server.tld.crt
SSLCertificateKeyFile /etc/apache2/ssl/your.server.tld.key
SSLEngine on
SSLOptions +StdEnvVars
<Location />
    Order allow,deny
    allow from all

    SSLRequireSSL
    SSLVerifyDepth 1
    SSLVerifyClient optional_no_ca
    SSLRequire (\
        %{SSL_CLIENT_CERT} eq file("/etc/apache2/ssl/validclient.crt")\
    )
</Location>

答案3

如果您打算使用自签名客户端证书(这可能是有意义的,但应谨慎使用,因为它们最终需要以某种方式进行验证),您将需要:

  • 让服务器在其证书请求 TLS 消息中发送一个空的 CA 列表(以便浏览器为您提供其拥有的所有证书(包括自签名证书)之间的选择):这可以通过SSLCADNRequestFile指向一个带有空行的文件来完成;
  • 让服务器接受任何证书:这可以通过来完成SSLVerifyClient optional_no_ca

更多详情请参阅这个答案

相关内容