Статус: Новичок
Группы: Участники
Зарегистрирован: 01.11.2023(UTC) Сообщений: 8 
|
Автор: lexZ86  Автор: Евгений Афанасьев  В последнем присутствует расширение server_name.
Если не ошибаюсь, по умолчанию это расширение в дефолтной SSLSocketFactory не добавляется. Вероятно, сейчас это сделала какая-то обертка над SSLSocketFactory, например, в spring boot.
Думаю Вы правы, проблема с SNI. Много где обсуждается. Простое задание System.setProperty("jsse.enableSNIExtension", true); не спасает. По крайней мере понятно где разбираться. ИИ подсказал, что необходимо кастомизировать класс SSLSocketFactory.
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.InputStreamReader; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; import java.net.URL; import java.security.KeyStore; import java.util.Collections; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SNIHostName; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLHandshakeException; import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManagerFactory;
public class eln { public static void main(String[] args) throws Exception { try { URL url = new URL("https://eln.sfr.gov.ru/ws-insurer-crypto/FileOperationsLnService?wsdl");
KeyStore trustStore = KeyStore.getInstance("JKS"); trustStore.load(new FileInputStream("ks.jks"), "12345678".toCharArray());
TrustManagerFactory trustMgrFactory = TrustManagerFactory.getInstance("GostX509"); trustMgrFactory.init(trustStore);
SSLContext sslContext = SSLContext.getInstance("GostTLSv1.2"); sslContext.init(null, trustMgrFactory.getTrustManagers(), null); String targetHost = "eln.sfr.gov.ru";
System.setProperty("com.sun.security.enableCRLDP", "true"); System.setProperty("com.ibm.security.enableCRLDP", "true");
SSLSocketFactory customFactory = new SSLSocketFactory() { private final SSLSocketFactory defaultFactory = sslContext.getSocketFactory(); private Socket configureSni(Socket socket, String host) { if (socket instanceof SSLSocket) { SSLSocket sslSocket = (SSLSocket) socket; SSLParameters params = sslSocket.getSSLParameters(); params.setServerNames(Collections.singletonList(new SNIHostName(host))); sslSocket.setSSLParameters(params); } return socket; }
@Override public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { return configureSni(defaultFactory.createSocket(s, host, port, autoClose), targetHost); } @Override public Socket createSocket(String host, int port) throws IOException { return configureSni(defaultFactory.createSocket(host, port), targetHost); } @Override public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException { return configureSni(defaultFactory.createSocket(host, port, localHost, localPort), targetHost); } @Override public Socket createSocket(InetAddress host, int port) throws IOException { return configureSni(defaultFactory.createSocket(host, port), targetHost); } @Override public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { return configureSni(defaultFactory.createSocket(address, port, localAddress, localPort), targetHost); } @Override public String[] getDefaultCipherSuites() { return defaultFactory.getDefaultCipherSuites(); } @Override public String[] getSupportedCipherSuites() { return defaultFactory.getSupportedCipherSuites(); } };
try { HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("SOAPAction", "http://www.fss.ru/integration/ws/eln/ins/getPrivateLNData/v01"); connection.setDoOutput(true); connection.setSSLSocketFactory(customFactory); try { BufferedReader reader2 = new BufferedReader(new InputStreamReader(new FileInputStream("encryptfile.xml"), "UTF-8")); String line1; StringBuilder body = new StringBuilder(); while ((line1 = reader2.readLine()) != null) { body.append(line1); } reader2.close();
try { OutputStreamWriter writer1 = new OutputStreamWriter(connection.getOutputStream()); writer1.write(body.toString()); writer1.flush();
try { BufferedReader reader3 = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); String line2; StringBuilder response1 = new StringBuilder(); while ((line2 = reader3.readLine()) != null) { response1.append(line2); } reader3.close();
FileWriter writer2 = new FileWriter("response.xml", false); writer2.write(response1.toString()); writer2.close(); } catch (IOException ex) { ex.printStackTrace(); BufferedReader reader3 = new BufferedReader(new InputStreamReader(connection.getErrorStream())); String line2; StringBuilder response = new StringBuilder(); while ((line2 = reader3.readLine()) != null) { response.append(line2); } reader3.close();
FileWriter writer2 = new FileWriter("error.xml", false); writer2.write(response.toString()); writer2.close(); } catch (OutOfMemoryError ex) { ex.printStackTrace(); } } catch (SocketException | SSLHandshakeException ex) { ex.printStackTrace(); } } catch (FileNotFoundException ex) { System.out.println("File encryptfile.xml not found"); }
} catch (UnknownHostException ex) { ex.printStackTrace(); } } catch (MalformedURLException ex) { ex.printStackTrace(); } } }
|