Задача: требуется установить соединение из 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