[英]Which SSL certificate will be selected if client has multiple certificates in key store
[英]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客戶端將應用以下算法:
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.