Мне нужна ваша помощь здесь при вызове службы отдыха HTTPS.
Некоторые сведения, мне нужно вызвать службу отдыха, размещенную как HTTPS.
Я получил сертификат, и мне удалось получитьответ от почтальона. Очень важно, я мог подключиться только тогда, когда объявил в Postman сертификат как « ca сертификат », если я объявил его как « сертификат клиента ». Я не смог подключиться.
Теперь я хотел вызвать службу через Java, поэтому я генерирую JKS с помощью keytool:
C: \ WINDOWS \ system32> keytool -import -trustcacerts -alias PublicKeyFromCEF -file service.cer -keystore ABCD.jks
Я построил клиент
System.setProperty("javax.net.ssl.trustStore", "c:/ABCD.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "123456");
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
char[] passphrase = "123456".toCharArray(); //password
KeyStore keystore = KeyStore.getInstance("JKS");
//KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(new FileInputStream("c:/ABCD.jks"), passphrase); //path
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keystore);
SSLContext context = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = tmf.getTrustManagers();
context.init(null, trustManagers, null);
SSLSocketFactory sf = context.getSocketFactory();
URL url = new URL("https://services/api/v1/doctors?docId=5555");
HttpsURLConnection httpsCon = (HttpsURLConnection) url.openConnection();
httpsCon.setSSLSocketFactory(sf);
httpsCon.setRequestMethod("GET");
System.out.println("Response Message is " + httpsCon.getResponseMessage());
Когда я вызываю службу, я получаю сообщение об ошибке: java.net.SocketException: сброс соединения в методе java.net.SocketInputStream#socketRead
Я подозреваю, что я не сгенерировал JKS правильно
Вот состояние объектов при отладке, надеюсь, оно пролило свет:
в методе sun.security.ssl.SSLSocketImpl#performInitialHandshake
:
this.input.r.helloVersion = LTSv1
this.input.r.getHandshakeHash() : mds,sha are null, data is populated.
в методе: sun.security.ssl.InputRecord#read
this.exlen =0
тогда я получаю исключение на java.net.SocketInputStream#tRead
при вызове n = socketRead(fd, b, off, length, timeout);