Ошибка инициализации контекста SSL по умолчанию: null - PullRequest
1 голос
/ 14 октября 2010

При создании сервера SSL я получил следующее исключение: Default SSL context init failed: null.Кажется, это происходит из-за того, что он не может найти хранилище ключей и хранилище доверенных сертификатов.Я пытаюсь установить их из файла JAR.Файл существует в банке, но кажется, что ресурс не может быть найден.

String keystore = TestFramework.class.getResource("/security/keystore.jks").getFile();
System.setProperty("javax.net.ssl.keyStore", keystore);
System.setProperty("javax.net.ssl.keyStorePassword", password);
String truststore = TestFramework.class.getResource("/security/truststore").getFile();
System.setProperty("javax.net.ssl.trustStore", truststore);
System.setProperty("javax.net.ssl.trustStorePassword", "ebxmlrr");

Я выполнил команду ls, чтобы проверить, существует ли файл.Это существует.Затем я проверяю, существует ли keystore.jks, запустив команду jar -tf myjar.jar | grep security и она существует.

security/
security/keystore.jks
security/truststore

Мое приложение работает под управлением Tomcat.

1 Ответ

6 голосов
/ 14 октября 2010

Причина, по которой это не сработает, заключается в том, что эти системные свойства ожидают файл в реальной файловой системе, а не в архиве. Вам лучше создать свои собственные SSLContext, используя эти хранилища ключей и потоки доверия:

KeyStore keyStore = KeyStore.getInstance("jks");
keyStore.load(TestFramework.class.getResourceAsStream("/security/keystore.jks"), password.toCharArray());
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
keyManagerFactory.init(keyStore, password.toCharArray());

KeyStore trustStore = KeyStore.getInstance("jks");
trustStore.load(TestFramework.class.getResourceAsStream("/security/truststore"), "ebxmlrr".toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
trustManagerFactory.init(trustStore);

SSLContext context = SSLContext.getInstance("SSL");
context.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());

...

HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.setSSLSocketFactory(context.getSocketFactory());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...