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

GRUT 2021


В этом году я бежал трассу Т100 (110 км) и сошел на 71 км. Причина схода — жара, недостаточная физическая подготовка в купе с недавно перенесенным COVID-19. Результат говорит сам за себя, я был последним во всем: общий, среди мужчин и в своей возрастной группе.

Этот забег действительно был жарким, многие сошли по разным причинам. Из 535 участников забега финишировало 416, а остальные 119 в том числе и я, сошли с дистанции.

Планы — готовится лучше, тут явно видно, что ближайшие 3-5 лет мой потолок Т50. Формат мероприятия мне очень нравится, буду продолжать ездить, но на меньшие дистанции.

Кому на Руси жить хорошо


Судя по графику прироста населения, на Руси дела все хуже и хуже, не смотря на проект «материнский капитал» и повышение выплат на детей и развитие программы поддержки социальных проектов.

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

Ссылка на обзор 1990 — 2000 годов.

Ссылка на данные.

Рождаемость в России


Нашел статистику по рождаемости в России и решил использовать Qlik Sense для визуализации найденной информации.

Что видно на графике, молодые 20-24 года перестают рожать, 25-29 рожают стабильно, больше стали рожать 30-35 и 35-39.

На графике видно, что с 1995 — 2001 год в стране резко упала рождаемость или статистика собиралась некачественно, что маловероятно в вопросах демографии.

Рождаемость за 1990, 2000, 2010, 2018