因此,我正在嘗試通過在 Java 程序中使用客戶端證書來測試與我公司 Web 服務器的連接(使用 2 路 SSL)。我嘗試在 curl 調用中使用相同的證書(分離的證書和密鑰)并設法獲得所需的響應。但是當我嘗試在我的 Java 程序中使用它(組合成 pkcs12 格式)時,它會給出 400 響應,說沒有發送所需的 SSL 證書。為什么會這樣?public static void main(String[] args) { System.out.println("Taufiq's mutual SSL-authentication test"); org.apache.log4j.BasicConfigurator.configure(); Logger.getRootLogger().setLevel(Level.INFO); try { final String CERT_ALIAS = "something", CERT_PASSWORD = "something"; KeyStore identityKeyStore = KeyStore.getInstance("pkcs12"); FileInputStream identityKeyStoreFile = new FileInputStream(new File("src/Cert.p12")); identityKeyStore.load(identityKeyStoreFile, CERT_PASSWORD.toCharArray()); KeyStore trustKeyStore = KeyStore.getInstance("jks"); FileInputStream trustKeyStoreFile = new FileInputStream(new File("src/truststore.jks")); trustKeyStore.load(trustKeyStoreFile, CERT_PASSWORD.toCharArray()); SSLContext sslContext = SSLContexts.custom() // load identity keystore .loadKeyMaterial(identityKeyStore, CERT_PASSWORD.toCharArray(), new PrivateKeyStrategy() { @Override public String chooseAlias(Map<String, PrivateKeyDetails> aliases, Socket socket) { return CERT_ALIAS; } }) // load trust keystore .loadTrustMaterial(trustKeyStore, null) .build(); SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, new String[]{"TLSv1.2", "TLSv1.1"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier()); CloseableHttpClient client = HttpClients.custom() .setSSLSocketFactory(sslConnectionSocketFactory) .build(); // Call a SSL-endpoint callEndPoint (client); } catch (Exception ex) { System.out.println("Boom, we failed: " + ex); ex.printStackTrace(); }} } }
2 回答

莫回無
TA貢獻1865條經驗 獲得超7個贊
我想你知道 ssl 握手是如何工作的。如果沒有,請熟悉一下。然后使用wireshark查看ssl握手。您將獲得比一些該死的 http 庫解釋更好的 ssl 警報詳細信息。如果有的話,這是一個誤導性錯誤。
可以肯定的是,您的服務器必須信任您的客戶端證書,所以我假設您首先正確設置了東西;你說你試過 curl 但你沒有說它是否有效。
最后,我不認識這些 SSL 類,所以您導入的不是 jdk 的 jsse 類;您可能是此類庫的受害者。
添加回答
舉報
0/150
提交
取消