Шифрование связи между клиентом и сервером обеспечивает повышенную безопасность и защиту конфиденциальности вашей системы. Это может быть важным требованием клиента, особенно если клиенту или серверу необходимо работать в незащищенной сети.
В этой статье показано, как настроить зашифрованные с помощью SSL вызовы EJB в JBoss AS 7.
сервер
Есть только две вещи, которые нужно сделать на стороне сервера:
- создание хранилища ключей с парой ключей Privat / Public для шифрования и
- ссылка на хранилище ключей в конфигурации сервера.
Исходный код вашего приложения остается неизменным с шифрованием или без него.
Создание ключей
Java предоставляет инструмент keytool, который мы будем использовать для управления хранилищем ключей и для создания пары ключей private / public. Пример ниже создает пару 1024-битных ключей с использованием алгоритма RSA и добавляет их в хранилище ключей server.keystore . Хранилище ключей будет создано, если оно не существует.
|
1
2
3
|
keytool -genkey -alias jboss -keyalg RSA -keysize 1024 -keystore server.keystore -validity 365 -keypass 123456 -storepass 123456 -dname "CN=localhost, O=thoughts-on-java.org" |
Нам нужно будет предоставить это хранилище ключей серверу приложений JBoss. Поэтому я предпочитаю хранить его в каталоге конфигурации JBoss. Но вы можете хранить его в любом месте, пока сервер JBoss может получить к нему доступ.
Конфигурация сервера
Теперь мы должны сослаться на хранилище ключей в конфигурации JBoss. Поэтому мы добавляем элемент идентификации сервера в конфигурацию области безопасности области приложения.
В следующем фрагменте показан пример конфигурации с использованием стандартной конфигурации ApplicationRealm и файла server.keystore, расположенного в каталоге конфигурации JBoss:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
<management> <security-realms> <security-realm name="ManagementRealm"> <authentication> <properties path="mgmt-users.properties" relative-to="jboss.server.config.dir"/> </authentication> </security-realm> <security-realm name="ApplicationRealm"> <server-identities> <ssl> <keystore path="server.keystore" relative-to="jboss.server.config.dir" password="123456"/> </ssl> </server-identities> <authentication> <properties path="application-users.properties" relative-to="jboss.server.config.dir"/> </authentication> </security-realm> </security-realms> ... |
Это все, что нужно сделать на стороне сервера.
клиент
На стороне клиента нам нужно сделать следующее:
- импортировать открытый ключ сервера в хранилище ключей клиента,
- определить шифрование SSL в EJBClientProperties и
- укажите местоположение и пароль хранилища ключей с аргументами JVM открытого ключа.
Импорт ключа
Сначала нам нужно экспортировать открытый ключ пары ключей, которую мы добавили в хранилище ключей сервера. Это также можно сделать с помощью keytool :
|
1
|
keytool -export -keystore server.keystore -alias jboss -file server.cer -keypass 123456 -storepass 123456 |
Хранилище ключей будет создано, если оно не существует.
Хорошо, теперь мы можем добавить ключ в хранилище ключей клиента:
|
1
|
keytool -import -trustcacerts -alias jboss -file server.cer -keystore client.keystore -keypass 123456 -storepass 123456 |
EJBClientProperties
В EJBClientProperties нет большой разницы. Для свойств remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED и remote.connection.default.connect.options.org.xnio.Options.SSL_STARTTLS необходимо установить значение true . Остальное остается без изменений.
В следующем фрагменте показано создание зашифрованного соединения SSL с сервером и поиск SLSB.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
// define EJB client propertiesfinal Properties props = new Properties();// define SSL encryptionprops.put("remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED", "true");props.put("remote.connection.default.connect.options.org.xnio.Options.SSL_STARTTLS", "true");// connection propertiesprops.put("remote.connections", "default");props.put("remote.connection.default.host", "localhost");props.put("remote.connection.default.port", "4447");// user credentialsprops.put("remote.connection.default.username", "test");props.put("remote.connection.default.password", "1234");props.put("remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS", "JBOSS-LOCAL-USER");props.put("remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false");props.put("remote.connection.default.connect.options.org.jboss.remoting3.RemotingOptions.HEARTBEAT_INTERVAL", "600000");// create EJB client configurationfinal EJBClientConfiguration clientConfiguration = new PropertiesBasedEJBClientConfiguration( props);// create and set a context selectorfinal ContextSelector<EJBClientContext> contextSelector = new ConfigBasedEJBClientContextSelector( clientConfiguration);EJBClientContext.setSelector(contextSelector);// create InitialContextfinal Hashtable<Object, Object> contextProperties = new Hashtable<>();ejbURLContextFactory.class.getName();contextProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");InitialContext initialContext = new InitialContext(contextProperties);// lookup SLSBGreeterRemote greeter = (GreeterRemote) initialContext .lookup("ejb:/test/Greeter!blog.thoughts.on.java.ssl.remote.GreeterRemote");Assert.assertEquals("Hello World!", greeter.greet("World")); |
Аргументы JVM
Хорошо, теперь мы почти закончили. Не хватает только ссылки на хранилище ключей клиента. Это можно сделать с помощью аргументов JVM javax.net.ssl.trustStore для местоположения и javax.net.ssl.trustStorePassword для пароля хранилища ключей, например:
|
1
|
-Djavax.net.ssl.trustStore=src\test\resources\client.keystore -Djavax.net.ssl.trustStorePassword=123456 |
Это все, что нужно сделать для настройки EJB-вызовов с шифрованием SSL с JBoss AS 7.
Поиск проблемы
Если есть какие-либо проблемы со связью, вы можете установить -Djavax.net.debug = true, чтобы включить сообщения отладки.
Вывод
В этой статье мы рассмотрели изменения конфигурации и кода для настройки зашифрованных вызовов EJB с помощью JBoss AS 7. Это можно сделать за несколько минут и обеспечивает улучшенную защиту и защиту конфиденциальности вашего общения.
| Ссылка: | Зашифрованные с помощью SSL EJB звонки с JBoss AS 7 от нашего партнера по JCG Торбена Янссена в блоге Некоторые мысли о Java (EE) . |