Java Исключение SSL с SSLContext по умолчанию - PullRequest
0 голосов
/ 07 августа 2020

Погружаясь прямо в код, вот метод, который я использую для создания 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. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...