Погружаясь прямо в код, вот метод, который я использую для создания SSLContext
private static SSLContext createContext(String keystore_path, String truststore_path, String password) throws Exception {
final KeyStore key_store = KeyStore.getInstance("JKS");
final KeyStore trust_store = KeyStore.getInstance("JKS");
final char[] passphrase = password.toCharArray();
key_store.load(new FileInputStream(keystore_path), passphrase);
trust_store.load(new FileInputStream(truststore_path), passphrase);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(key_store, passphrase);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(trust_store);
SSLContext ssl_ctx = SSLContext.getInstance("TLSv1");
ssl_ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
return ssl_ctx;
}
Полученный в результате SSLContext затем используется для создания экземпляров SSLEngine, которые я использую для шифрования сетевых коммуникаций. Теперь, когда это не проблема, я попробовал 3 разных способа создания SSLContext, и только один работает. Я хотел бы понять, почему 2 других терпят неудачу, и как заставить их работать (если возможно). Оба сбойных не работают во время квитирования SSL.
Метод № 1 (работает)
Мои квитирования SSL работают при использовании моего собственного хранилища доверенных сертификатов и хранилища ключей, например:
ssl_ctx = createContext(my_keystore_file, my_truststore_filepath, my_password);
Метод №2 (НЕ работает)
final String default_store_path = System.getProperties().getProperty("java.home") + File.separator + "lib"
+ File.separator + "security" + File.separator + "cacerts";
final String default_password = "changeit";
ssl_ctx = createContext(default_store_path, default_store_path, default_password);
В этом случае я получаю следующее исключение:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: no cipher suites in common
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:307)
...
Метод №3 (НЕ работает)
ssl_ctx = SSLContext.getDefault();
Но на этот раз я получаю следующее исключение:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: No available authentication scheme
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:307)
Кстати, я не заинтересован в использовании сторонней библиотеки, такой как Grizzly. Спасибо!