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