繁体   English   中英

如果有多个匹配的证书,如何选择SSL客户端证书?

[英]How is the SSL client certificate chosen when there are multiple matching certificates?

这不是设计应该发生的事情,但出于安全考虑,我想知道如何将“正确”的证书发送到服务器,假设有多个证书符合某个CA签名的要求?

我正在使用一个简单的SSL JAVA示例客户端,连接到Apache HTTPD。

我尝试使用4个证书进行测试,每次都删除所选的证书,并注意下一个选择了谁。 除了证书的“sha256”的词典顺序之外,我找不到合理的逻辑(即日期,别名等)。 这似乎不太可能......

示例客户端执行类似的操作

System.setProperty("javax.net.ssl.keyStore","device.p12");  
System.setProperty("javax.net.ssl.keyStorePassword","password");  
System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");  
System.setProperty("javax.net.ssl.trustStore","truststore.jks");  
System.setProperty("javax.net.ssl.trustStorePassword","password");  
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();  
SSLSocket sslSock = (SSLSocket) factory.createSocket("87.69.60.100",443);  
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sslSock.getOutputStream(), "UTF8"));  
wr.write("GET /lather HTTP/1.1\r\nhost: 87.69.60.100\r\n\r\n");  
wr.flush();  

Apache配置了

SSLCACertificateFile rootCA.crt  
SSLVerifyClient require  

我找不到相关文件来回答这个问题。 我也想知道 - Apache是​​否有可能以某种方式转发多个证书链? (对于一个行为不端的客户发送一些奇怪的东西)。

谢谢!

需要客户端身份验证的服务器将发送可接受的证书类型列表,可能还包含可接受的CA列表。 默认情况下,您的Java客户端将应用以下算法:

  1. 对于服务器接受的每种证书类型(RSA,DSA,EC),查找密钥库中使用指定算法生成的任何公钥/私钥对
  2. 如果服务器发送了可接受的CA列表,请删除其证书链中列表中不包含任何CA的任何密钥对
  3. 如果剩余至少一个密钥对,则选择与第一个密钥对对应的私钥; 否则返回步骤1以获取下一个键类型。

RFC 5246中未指定客户端证书选择算法,但Java的简单默认实现似乎是合理的,如果EJP指出将来可能会发生变化。 特别是,“第一个”几乎是随机的 - 凭证当前存储在Map ,因此它将取决于条目集的迭代顺序。 此外, KeyManager实现是可插入的,并且OpenJDK提供了一个'NewSun'实现,它通过传递安全属性ssl.KeyManagerFactory.algorithm=NewSunX509 第二个还将考虑您的客户端证书的keyUsage和extendedKeyUsage属性,以及到期日期。

如果您需要保证从可能列表中发送的证书,并且您发现默认行为不是为您执行此操作,则最佳选择是手动创建单项密钥库并使用它来初始化SSLContext ,或者写入你自己的实行X509KeyManager做你想做的事, chooseClientAlias ,想在回答这个问题,还是这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM