使用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_DN或SSL_CLIENT_CERT_CHAIN_<n>环境variables ca1clients.example.com或ca2clients.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。 另一个困难是用户之间交换链接(例如通过电子邮件发送链接到某些内容)。