*** Использование утилиты tls_proxy ***

Утилита запускается в командной строке:

JRE/bin/java -jar tls_proxy.jar <listen-port>
JRE/bin/java -jar tls_proxy.jar <listen-port> <path-to-config>

Для корректного функционирования требуется, чтобы в JRE со снятыми ограничениями был установлен JCP, JTLS с валидными лицензиями. Также tls_proxy требуется конфигурационный файл с указанием параметров подключения, хранилища доверенных корневых сертификатов и адресов хостов. Каждому https-хосту соответствует некий listen-port. Таким образом, каждый экземпляр приложения, запущенный со своим listen-port, будет передавать трафик конкретному хосту, которому данный listen-port соответствует.
Образец файла настройки config.xml с краткими пояснениями можно получить, выполнив команду:

JRE/bin/java -jar tls_proxy.jar -help

Утилита работает следующим образом. После запуска приложения создается серверный сокет, слушающий порт listen-port. В config.xml происходит поиск подходящего хоста по listen-port. Как только появляются подключения к listen-port, создается клиентская сессия. В начале сессии выполняется загрузка хранилища доверенных корневых сертификатов, поиск и загрузка ключевого контейнера (если необходимо) по параметрам, указанным в config.xml. Затем создается защищенный контекст, а из него - сокет для подключения к хосту. Далее осуществляется передача трафика хосту и обратно. Сокеты могут быть закрыты после некоторого периода неактивности, который устанавливается в параметрах config.xml.

*** Классы и функции JSSE, используемые в приложении tls_proxy ***

Для создания защищенного контекста SSLContext используется метод, описанный в руководстве программиста (JTLS), алгоритмы для работы с ключевыми контейнерами и хранилищами доверенных корневых сертификатов провйдера JCP и алгоритмы GostX509 и GostTLS провайдера JTLS:
1) с помощью стандартного класса KeyStore инициализируется хранилище контейнеров формата HDImageStore (JCP);
2) с помощью стандартного класса KeyStore инициализируется хранилище доверенных корневых сертификатов формата CertStore (JCP);
3) с помощью стандартного класса KeyManagerFactory на алгоритме GostX509 загружается хранилище ключевых контейнеров KeyStore формата HDImageStore. Если используется клиентская аутентификация, то объекту класса KeyManagerFactory передается пароль для доступа к ключевому контейнеру клиента;
4) с помощью стандартного класса TrustManagerFactory на алгоритме GostX509 загружается хранилище доверенных сертификатов KeyStore формата CertStore с указанием пароля для доступа к нему;
5) с помощью стандартной класса и метода SSLContext.getInstance() на алгоритме GostTLS создается защищенный контекст SSLContext;
6) созданный защищенный контекст SSLContext инициализируется созданными раннее объектами классов KeyManagerFactory и TrustManagerFactory;
7) с помощью метода getSocketFactory из защищенного контекста получается фабрика сокетов для создания TLS-подключения с указанными параметрами;
8) далее при необходимости с помощью указанной фабрики создаются защищенные сокеты SSLSocket.

В коде используются высокоуровневые классы и абстракции, предоставляемые стандартным интерфейсом JSSE. Таким образом, косвенно вызываются классы, зарегистрированные с помощью алгоритмов провайдера JTLS:
1) KeyManagerFactory на зарегистрированном алгоритме GostX509 - X509KeyManagerImpl (JTLS);
2) KeyManagerFactory на зарегистрированном алгоритме GostX509 - X509TrustManagerImpl (JTLS);
3) SSLContext на зарегистрированном алгоритме GostTLS - SSLContextImpl (JTLS);
4) метод getSocketFactory класса SSLContext возвращает SSLSocketFactoryImpl (JTLS).

В коде для создания защищенного соединения вызываются следующие классы и методы создаваемых объектов:
1) KeyStore.getInstance() с типом HDImageStore и KeyStore.load() для загрузки ключевых контейнеров;
2) KeyStore.getInstance() с типом CertStore и KeyStore.load(store, password) с указанием пути и пароля для загрузки хранилища доверенных сертификатов;
3) KeyManagerFactory.getInstance() на алгоритме GostX509 для инициализации менеджера ключей и KeyManagerFactory.init(KeyStore, password) для загрузки ключевых контейнеров в менеджер ключей;
4) TrustManagerFactory.getInstance() на алгоритме GostX509 для инициализации менеджера хранилища доверенных сертификатов и TrustManagerFactory.init(KeyStore) для загрузки доверенных сертификатов в менеджер хранилища доверенных сертификатов;
5) SSLContext.getInstance() на алгоритме GostTLS для создания объекта защищенного контекста и SSLContext.init(KeyManagerFactory.getKeyManagers(), TrustManagerFactory.getTrustManagers(), null) для инициализации контекста с помощью менеджеров ключей и хранилища доверенных сертификатов;
6) SSLContext.getSocketFactory() для получения фабрики SSL-сокетов;
7) SSLSocketFactory.createSocket(host, port) для создания SSL-сокета с подключением к указанному хосту и порту;
8) с помощью созданного SSL-сокета осуществляется подключение, согласование алгоритмов и протоколов и т.п. согласно параметрам, переданным ранее в защищенный контекст.

