Подключение по 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

Получение IP пользователя Notes сессии


Вам требуется в момент сохранения документа вставлять IP адрес сессии пользователя подключившегося к серверу через толстого клиента Lotus Notes.

Проблема в том, что вы с легкостью можете получить IP, но только локальный, а не IP сессии. Например, вы работаете из дома и дома у вас есть WiFi или Домашний интернет, у вашего компьютера будет адрес 192.168.1.10 (пример), но на сервере у вас будет внешний IP провайдера.

Так вот, требуется узнать IP сессии на сервере.

Для этого, мы создаем на сервере базу для запросов IP сессии и предоставляем пользователю возможность записывать и считывать только свои документы, это необходимо для передачи параметров запроса. Далее создаем RunOnServer агент с административными правами для обращения к консоли сервера.

Администратор, должен проверить, что выдает консоль сервера, выполнив запрос SHOW USERS DEBUG. Ответ должен содержать IP адреса пользователей, если не содержит надо добавить в NOTES.INI сервера параметр Log_Connection=1

Дале используем стандартную команду session.sendconsolecommand(«»,»sh users debug»), в ответе находим по имени пользователя IP сессии в момент выполнения агента RunOnServer.

По завершении выполнения агента RunOnServer в документе который создал пользователь с параметрами, мы записываем IP адрес.

Для предотвращения несанкционированного доступа пользователей к информации о других пользователях в запросе предусматриваем поле типа READERS в которое записываем имя запросившего IP пользователя.

CONNECTIVITY DEBUG

Debug_TCP_All=1
This provides low-level TCP/IP session information and must be used rarely because of the amount of logging and possible impact to Domino server performance.

Debug_TCP_Errors=1
This is similar to the Debug_TCP_All=1 parameter, in that, it provides low-level information about TCP-related errors that are encountered.

Log_Connections=1
When this debug parameter is set, the Domino server console displays the Notes network port, the network address of the requesting system, and the network address of the destination server.

Log_Sessions=1
Enabling this parameter posts each individual session to the Domino server console, and includes the user and the version of the Notes client being used.Chapter 8. Problem determination 353

Debug_TCP_Session=1
This enables debug information about when sessions are opened and closed to the Domino server console.

Новый год — новая работа


2019 год начался с реорганизации, закрываются направления, персонал выводится за штат, полная неразбериха. Все это заставляет провести оценку своим силам и возможностям.

Первую программу я написал на языке Basic в 1987 году, у нас с братом был компьютер Партнер на котором мы самостоятельно осваивали основы программирования, на языках Basic и Assembler. Через пару лет у нас уже был компьютер i386 с жестким диском на 80 мб и матричный принтер, это было очень круто.

Первая ИТ запись в трудовой у меня значится 1992 годом.

Следующим этапом карьерной лестницы был переезд в Краснодар и моя работа в 1996 году на фирме ПКФ «СБ» в качестве программиста Lotus Notes и системного администратора, именно здесь я нашел себя как профессионала. Мной был написан оперативный финансовый учет, кадровый учет, учет потребления пользователей интернет (фирма кроме торговле средствами защиты растений еще предоставляла услуги интернет для населения Краснодара). В этой компании я проработал семь лет, приобрел значительный багаж знаний в области ИТ, управления персоналом, описание бизнес процессов и много другое.

Все заканчивает, и на смену ПКФ «СБ» пришел опыт создания СЭД под нужды заказчиков и интерактивные сайты на Domino, в числе заказчиков были такие клиенты как Администрация Краснодарского края, СРО Краснодарские строители, Кубань Энерго, Кубанское РДУ. Написанные мной системы отработали более пяти лет и были заменены, где по политическим мотивам, где из за устаревания, но кое где еще работают.

В 2014 году я переехал в Москву и моя карьера сделал очередной виток, я получил доступ к новым интересным проектам и в ходе их реализации приобрел опыт как более оперативно и качественно и главное в сотрудничестве с другими программистами разрабатывать и сопровождать системы. В числе мест о которых у меня остались теплые воспоминания я могу назвать: Домодедово, банк и страховая «Евросиб»,  банк «Металлинвест».

В 2018 году я восстановил свои навыки управления персоналом, работая в Аналитический центр Минсельхоза России, где познакомился с BI (бизнес анализ) и замечательным программным продуктом Qlik. Концепция этого продукта отлично сочетается с принципами Lotus Notes и они прекрасно дополняют друг друга.

ЕСЛИ КРАТКО:

1987 —  первая программа
1992 — первая ИТ запись в трудовой
1996 — первое знакомство с Lotus Notes
2000 — сертифицированный администратор Lotus Notes
2003 — разработка мобильных сервисов, SMS сервисов, вопросы авторского права на контент и все, что связано с продажей контента
2005 — внутренний аудитор системы менеджмента качества  ISO 9000
2010 — сертифицированный инженер Microsoft
2014 — переезд в Москву
2018 — Lotus + Java + Postgress + ActiveMQ + WebServices
2019 — QlikSense + WSDL

Закат эпохи Lotus


Сегодня (30.10.2018) ходил на мероприятие IBM Russia приуроченное к выходу Lotus Domino v10 и самолично наблюдал закат эпохи Lotus Notes. Сразу оговорюсь, сам продукт будет жить еще довольно долго, но тенденций к его использованию в России я не вижу.

Приглашение на мероприятие, содержало исключительно адрес, ни каких схем и рекомендаций в нем не было. На какой станции метро выходить, где именно находится литера «А».

Я спросил у охранника парковки и нашел здание, у которого как оказалось несколько входов, но я предположил, что мне нужен главный вход. Ни каких указателей, на то, что проводится важное для IBM мероприятие не имелось.

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

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

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

Хочу особо отметить работу Ивана Михалычева, доброжелательный, профессиональный, тактичный, внимательный.

Вот я сижу в полном зале людей которым искренне интересно узнать о Lotus Domino V10 и, что я вижу, практически каждому от сорока и больше, думаю 95% людей могли бы сказать, как и я сам, что разрабатывают на Lotus уже больше 20 лет. Главный докладчик Uffe Sorensen начинает доклад и в ходе доклада показывает ролики с интервью участников презентации Domino V10 в других странах и картина повторяется, это зрелые люди в возрасте. Где молодые разработчики, такие какими был я в 1995 году когда разработал свое первое приложение на Lotus 3.0.

Перерыв. Формат мероприятие предполагает живое общение как между участниками, так и с организаторами, но за всех отдувался Иван, остальные попрятались неизвестно куда.

Второй докладчик Luis Guirigay был на высоте, прекрасно провел презентацию и раскрыл тему. Большое ему спасибо. Огорчил тем, что русская версия Domino V10 появиться непонятно когда.

Партнерская серия докладов была ужасной, особенно Логика СЭД. Мы все собрались в офисе IBM на мероприятие посвященное Domino V10 и вместо того, чтобы рассказать с какими ситуациями и какие открытия они сделали при тестировании и миграции на Domino V10, мы выслушивали о функционале их бизнес продуктов, о которых мы и так много знаем, так как каждый имеет опыт по 20 лет в разработке Lotus и всех крупных игроков знаем на пересчет.

Понравился доклад ClevaDesk, все четко и по существу, но опять, тема Domino V10 не была раскрыта. Владимир Татаринцев из CYONE выступил уверенно, было познавательно, но опять, про Domino V10 было затронуто вскользь.

Завершение мероприятия не обошлось без сюрпризов, сразу после этого мероприятия, было организованно мероприятие для VIP партнеров и все докладчики со стороны IBM ушли на него, оставив приглашенных только с чаем и булочками (о которых я не хочу писать).

Я попытался уточнить информацию у девушек на ресепшене (три красавицы), но был послан в мягкой форме, то есть им было все равно, хотя вполне очевидно, что меня могли направить к куратору мероприятия (Ивану) и выразить сочувствие на лице и искреннюю озабоченность.

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

Еще один факт вызвал удивление у сотрудников IBM Russia — это наличие аналогов отечественного ПО на российском рынке, о таких продуктах как CommuniGate Pro они не знали, хотя на сайтах этих компаний написано, что они конкурируют с Lotus (мое личное мнение, конечно им очень далеко до lotus, но они работают над этим), список партнеров из госсекторара очень впечатляющий.

Вывод:

Руководство HR отдела IBM Russia надо менять, безразличие и лень, других слов я не нахожу. Первое впечатление обычно бывает верным.

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

Сама концепция Domino и ее стабильность очень привлекательна, но мир движется вперед, а IBM не поспевает и самый большой просчет — это стремительно стареющие кадры.

 

Ссылки:

https://www.ibm.com/blogs/collaboration-solutions/tag/domino-v10/

https://www.ibm.com/collaboration/ibm-domino

https://www.ibm.com/collaboration/ibm-domino/buy-v10

 

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/