Apache客户端身份validation:当CA名称不匹配时,浏览器不发送证书?

使用Apache 2.4。

我们有两个有效的CA证书,其唯一名称只有一个字符(比如dn:cn = MyCA,O = myOrg,CA2,dn:cn = MyCA,O = MyOrg)。

这两个证书都位于由SSLCACertificateFile Apache指令引用的文件中,因为我们需要对两个CA签名的客户端证书进行身份validation。 这不会发生:只有具有由CA1或CA2签名的客户端证书的浏览器才能访问,具体取决于文件中CA证书的顺序。 因此,如果只有来自CA1的客户端能够validation自己,那么在切换SSLCACertificateFile中的顺序并重新加载Apache之后,只有来自CA2的客户端才能够进行身份validation。

如果我们通过openssl s_client -connect <server>:<port> -prexit执行SSL握手,我们注意到只有一个CA专有名称在接受的CA列表中发送,并且发送的dn取决于命令其中CA证书在SSLCACertificateFile中。 这是有道理的,因为两个专有名称的Openssl计算出的散列是相同的,因为专有名称不应区分大小写。

但是,似乎浏览器执行区分大小写的匹配,相反,如Apache日志中所示,安装在浏览器中的证书在“广告CA”为CA1且客户端证书由CA2签名时不发送,反之亦然。 我们在Windows和Linux上使用Firefox,在Windows上使用Internet Explorer和Chrome。

否则,curl命令行浏览器没有这个问题,当我们调用带有客户端证书和密钥的PEM格式的https URL时。

如果没有真正挖掘,我会说你不能说服浏览器在这里做不区分大小写的search。 在简单的Web服务的情况下,你可以创build另一个VirtualHost所有的客户端分布(说https://detect-cert.example.com )。

这将意味着客户端协商TLS一次,然后它有一个redirect,然后是另一个TLS协商。

VirtualHost detect-cert.example.com:

  • 确保你接受来自浏览器的optional_no_ca证书
  • 没有SSLCACertificateFile
  • 查看SSL_CLIENT_I_DNSSL_CLIENT_CERT_CHAIN_<n>环境variables
  • redirect(HTTP 302)浏览器到ca1clients.example.comca2clients.example.com

VirtualHost ca1clients.example.com:

  • 确保你require浏览器的证书
  • SSLCACertificateFile CA_lowercase.pem

VirtualHost ca2clients.example.com:

  • 确保你require
  • SSLCACertificateFile CA_uppercase.pem

但是,您的Web应用程序需要同时支持两个域名(例如,通过X-Forwarded-Host标题)。 它永远不应该告诉通过ca2clients.example.cominput的浏览器通过ca2clients.example.com重新input。 另一个困难是用户之间交换链接(例如通过电子邮件发送链接到某些内容)。