我正在配置 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
是必要的,以便服务器知道哪些客户端被允许进入受保护区域,并且您至少需要SSLCACertificateFile
或SSLCACertificatePath
。
答案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
。
更多详情请参阅这个答案。