Статьи

Зашифрованные с помощью SSL вызовы EJB с JBoss AS 7

Шифрование связи между клиентом и сервером обеспечивает повышенную безопасность и защиту конфиденциальности вашей системы. Это может быть важным требованием клиента, особенно если клиенту или серверу необходимо работать в незащищенной сети.

В этой статье показано, как настроить зашифрованные с помощью SSL вызовы EJB в JBoss AS 7.

сервер

Есть только две вещи, которые нужно сделать на стороне сервера:

  1. создание хранилища ключей с парой ключей Privat / Public для шифрования и
  2. ссылка на хранилище ключей в конфигурации сервера.

Исходный код вашего приложения остается неизменным с шифрованием или без него.

Создание ключей

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>
 
   ...

Это все, что нужно сделать на стороне сервера.

клиент

На стороне клиента нам нужно сделать следующее:

  1. импортировать открытый ключ сервера в хранилище ключей клиента,
  2. определить шифрование SSL в EJBClientProperties и
  3. укажите местоположение и пароль хранилища ключей с аргументами 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 properties
final Properties props = new Properties();
// define SSL encryption
props.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 properties
props.put("remote.connections", "default");
props.put("remote.connection.default.host", "localhost");
props.put("remote.connection.default.port", "4447");
// user credentials
props.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 configuration
final EJBClientConfiguration clientConfiguration = new PropertiesBasedEJBClientConfiguration(
  props);
 
// create and set a context selector
final ContextSelector<EJBClientContext> contextSelector = new ConfigBasedEJBClientContextSelector(
  clientConfiguration);
EJBClientContext.setSelector(contextSelector);
 
// create InitialContext
final 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 SLSB
GreeterRemote 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. Это можно сделать за несколько минут и обеспечивает улучшенную защиту и защиту конфиденциальности вашего общения.