Подключение по SSL версии TLS 1.2


Задача: требуется установить соединение из java агента с сайтом по HTTPS по протоколу TLS 1.2 (например это надо для выгрузки файлов в облачное хранилище Amazon S3 (Simple Storage Service) или закачать информацию в SharePoint или дернуть REST).

По умолчанию Лотус использует TLS 1 и при подключении к ресурсам с TLS 1.2 появляется ошибка проверки сертификата.

Шаг 1: импортируем сертификат в хранилище Lotus

D:\Lotus\Notes\jvm\bin\ikeycmd -cert -add -db D:\Lotus\Notes\jvm\lib\security\cacerts -pw changeit -file d:\temp\mailru.cer -format ascii -trust enable -type jks

Шаг 2: скачиваем криптопровайдер и копируем в директорию D:\Lotus\Notes\jvm\lib\ext

bcprov-jdk15to18-1.65.jar и bctls-jdk15to18-1.65.jar и bcutil-jdk15to18-1.69.jar

Шаг 3: Редактируем D:\Lotus\Notes\jvm\lib\security\ java.security

#Добавляем два провайдера
security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.2=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider

#Перенумируем стандартные провайдеры
security.provider.3=com.ibm.jsse2.IBMJSSEProvider2
security.provider.4=com.ibm.crypto.provider.IBMJCE
security.provider.5=com.ibm.security.jgss.IBMJGSSProvider
security.provider.6=com.ibm.security.cert.IBMCertPath
security.provider.7=com.ibm.security.sasl.IBMSASL
security.provider.8=com.ibm.xml.crypto.IBMXMLCryptoProvider
security.provider.9=com.ibm.xml.enc.IBMXMLEncProvider
security.provider.9=com.ibm.security.jgss.mech.spnego.IBMSPNEGO
security.provider.10=sun.security.provider.Sun

Комментируем стандартные средства SSL и прописываем новые настройки

# Determines the default key and trust manager factory algorithms for
# the javax.net.ssl package.
#
#ssl.KeyManagerFactory.algorithm=IbmX509
#ssl.TrustManagerFactory.algorithm=IbmX509
ssl.SocketFactory.provider=org.bouncycastle.jsse.provider.SSLSocketFactoryImpl

Шаг 4: Проверка как все работает, пишем агент

import lotus.domino.*;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;

public class SSLPoke extends AgentBase {

    public void NotesMain() {

      try {
          Session session = getSession();
          AgentContext agentContext = session.getAgentContext();
        
          SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
          SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("mail.ru", 443);
          
          SSLParameters sslparams = new SSLParameters();
          sslparams.setEndpointIdentificationAlgorithm("HTTPS");
          sslsocket.setSSLParameters(sslparams);
          
          InputStream in = sslsocket.getInputStream();
          OutputStream out = sslsocket.getOutputStream();

          
          // Write a test byte to get a reaction :)
          out.write(1);

          while (in.available() > 0) {
              System.out.print(in.read());
          }
          System.out.println("Successfully connected");

      } catch(Exception e) {
          e.printStackTrace();
       }
   }
}

Не забудет перезапустить Лотус после внесения всех правок в конфиге и копирования jar файлов в директорию lib\ext.

Выполните агента и в Java консоли должно появиться:

дек 16, 2021 8:38:21 PM org.bouncycastle.jsse.provider.PropertyUtils getBooleanSecurityProperty
ИНФОРМАЦИЯ: Found boolean security property [keystore.type.compat]: true
дек 16, 2021 8:38:21 PM org.bouncycastle.jsse.provider.PropertyUtils getStringSystemProperty
ИНФОРМАЦИЯ: Found string system property [java.home]: D:\Notes\jvm
дек 16, 2021 8:38:21 PM org.bouncycastle.jsse.provider.PropertyUtils getStringSecurityProperty
ИНФОРМАЦИЯ: Found string security property [jdk.tls.disabledAlgorithms]: SSLv3, RC4, MD5withRSA, DH keySize < 768, 3DES_EDE_CBC, DESede, EC keySize < 224
дек 16, 2021 8:38:21 PM org.bouncycastle.jsse.provider.PropertyUtils getStringSecurityProperty
ИНФОРМАЦИЯ: Found string security property [jdk.certpath.disabledAlgorithms]: MD2, MD5, RSA keySize < 1024, DSA keySize < 1024, EC keySize < 224
Successfully connected

Интеграция Lotus и Redis


Как организовать интеграцию приложений Lotus с другими прикладными системами организации. На этот вопрос есть много ответов, одним из них, служба DECS, уже встроенная в Lotus Domino Server, но как показала практика ее мало кто использует (за 20 лет я не встречал коммерческой реализации этой службы). Самый распространенный вариант, это использование ODBC и обмен текстовыми файлами.

Я расскажу еще об одном способе использование, это Redis для интеграции и повышения производительности и гибкости приложений Domino.

Redis — хранилище в памяти по принципу ключ-значение, что дает возможность использовать его как кэш сервер. Основное его преимущество, наличие большого числа клиентов на разных языках и платформах и простора понимания принципов работы.

Алгоритм такой:

  1. Лотус загружает в Redis через java клиента данные необходимые для интеграции.
  2. Внешняя программа опрашивает Redis и перегружает информацию в нужные приложения, а при получения сигнала из внешних приложений (например статус документа) заносит ее в Redis
  3. Лотус с некоторой периодичностью просматривает хранилище Redis и переносит изменения в приложения Lotus.

Все довольно просто, есть возможность ускорить работу используя механизм подписки, тогда внешняя программа будет активироваться при загрузки информации Лотус моментально.

Так как Redis, это сервис в памяти, он обязательно должен располагаться на сервере Lotus Domino, только в этом случае будет достигнута максимальная производительность.

У Redis как и у Lotus Domino есть кластеризации, что делает его удобным в использовании на кластерах Domino.

Lotus Notes + Почта России


У Почты России имеется API для отслеживания посылок, регистрация для частного лица бесплатная, но в день можно сделать только 100 запросов. Хотите больше, надо заключать договор.

Техническое описание здесь https://tracking.pochta.ru/specification

Мне необходимо было организовать отслеживание отправлений непосредственно в Lotus Notes. Для этого я разработал агента на Java и запускал его на сервере, отправлений было не очень много, по этому я укладывался в рамки 100 запросов.

Из странного, трек который отдавал сервис не всегда совпадает с треком который выдается на сайте. Объяснение только одно, базы разные.

Пример можно скачать по ссылке: Download NSF

ActiveMQ and Lotus Notes


Использование сервиса очередей в приложениях Lotus Notes и Lotus Domino значительно упрощают жизнь разработчикам.

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

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

Кажется, что это все сложно, но вы изолируете друг от друга две системы, приложению не требуется права на запись в файл не надо заботиться о миграции подсистем, вы всегда можете переместить нумератор на другой сервер изменив запись в DNS.

Рецепт быстрого приготовления:

Скачайте ActiveMQ и установите на свой компьютер или сервер.

В настройках Lotus Notes необходимо разрешить выполнять java приложения в файле C:\Program Files\IBM\Lotus\Notes\jvm\lib\security\java.policy в самый конец файла добавьте:

grant { permission java.security.AllPermission; };

Скопируйте библиотеку C:\activemq\activemq-all-5.15.3.jar в C:\Program Files\IBM\Lotus\Notes\jvm\lib\ext

Перезапустите Lotus Notes, для того, чтобы заработала новая политика и загрузилась библиотека

Скачайте пример на Lotus Notes numerator

  1. Откройте приложение
  2. Перейдите в представление «Apps»
  3. Выделите настройку приложения «App2»
  4. Запустите агента «Actions->App->set app.in» для загрузки запроса номера из центрального «нумератора»
  5. Запустите агента «Actions->GetAgent» — он считывает запрос из очереди «app.in» находит по идентификатору приложения настройку в которой храниться последний выданный номер, получает следующий номер и размещает его в очереди «app.out»
  6. Выделите настройку «App2» и запустите агента «Actions->App->get app.out» который  считывает из очереди запись и записывает полученный номер в настройку.

http://activemq.apache.org/

Lotus Notes and Java and iText and cyrillic


Эта первая публикация из серии Lotus Notes и Java и посвящается, как создать PDF и вывести в него кирилический текст из документов Lotus Notes.

Для этого нам потребуется библиотека iText

Проблема с этой библиотекой в том, что шрифты используемые в этой библиотеки не содержат кириллических букв и нам потребуется шрифт с кириллицей, его можно найти в каталоге c:\windows\fonts\arial.ttf

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


String FONT_LOCATION = "arial.ttf";
BaseFont baseFont = BaseFont.createFont(FONT_LOCATION, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font font = new Font(baseFont, Font.DEFAULTSIZE, Font.NORMAL);

DocumentCollection dc =
agentContext.getUnprocessedDocuments();
Document doc = dc.getFirstDocument();
while (doc != null) {
document.add( Chunk.NEWLINE );
document.add(new Phrase("Документ UNID:"+doc.getUniversalID(), font));
document.add( Chunk.NEWLINE );
document.add(new Phrase("форма: "+doc.getItemValueString("Form"), font));
document.add( Chunk.NEWLINE );
document.add(new Paragraph(doc.getItemValueString("Subject"), font));
document.add( Chunk.NEWLINE );
doc = dc.getNextDocument();

}

В результате выполнения агента на выделенных документах, вы получите PDF файл расположены в каталоге c:\temp

Скачать пример | Download Demo