簡體   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