Nierozpoznana wiadomość SSL, połączenie w postaci zwykłego tekstu? Wyjątek

172

Mam pakiet zgodny z Javą, aby rozmawiać z serwerem https w sieci. Uruchomienie kompilacji daje następujący wyjątek:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
    at com.sun.net.ssl.internal.ssl.InputRecord.handleUnknownRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.InputRecord.read(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)

Myślę, że jest to spowodowane tym, że połączenie nawiązane z komputerem klienckim nie jest bezpieczne. Czy istnieje sposób na skonfigurowanie lokalnej maszyny lub portów w celu połączenia się ze zdalnym serwerem https?

karthi
źródło

Odpowiedzi:

238

Myślę, że jest to spowodowane tym, że połączenie nawiązane z komputerem klienckim nie jest bezpieczne.

Wynika to z faktu, że rozmawiasz z serwerem HTTP, a nie z serwerem HTTPS. Prawdopodobnie nie użyłeś prawidłowego numeru portu dla HTTPS.

Markiz Lorne
źródło
7
Mam ten sam błąd i rozwiązałem go, gdy zacząłem używać protokołu http zamiast https. Ale kiedy umieszczam link w przeglądarce z https to działa! I muszę wykonać bezpieczne zapytanie. Masz pomysł, jak mogę rozwiązać problem?
ccoutinho
9
@rsy Kiedy umieściłeś link ... z https, przeglądarka zmieniłaby się na port 443. Możesz zrobić to samo sam. Indeed HttpURLConnectionautomatycznie zrobi to za Ciebie, jeśli w ogóle nie określisz portu.
Markiz Lorne
Zakładam, że możesz ustawić dowolny port na swoim serwerze na HTTPS, nie musi to być określony port?
1
@KarlSherwin Może to być dowolny port, który chcesz, z zastrzeżeniem rezerwacji, ale jeśli nie jest 443, będziesz musiał umieścić go we wszystkich swoich adresach URL.
Markiz Lorne
18
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

Powinieneś mieć lokalną nazwę domeny SMTP, która skontaktuje się z serwerem poczty i ustanowi nowe połączenie, jak również powinieneś zmienić właściwość SSL w swoim programowaniu poniżej

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection

 props.put("mail.smtp.socketFactory.fallback", "true"); // Should be true
Thobith
źródło
10
Mówi po HTTPS, a nie SMTP. -1
Markiz Lorne
2
W moim przypadku to zadziałało, dzięki! javax.mail.MessagingException: nie można połączyć się z hostem SMTP: mail.livemusicgo.com, port: 25; zagnieżdżony wyjątek to: javax.net.ssl.SSLException: nierozpoznana wiadomość SSL, połączenie w postaci zwykłego tekstu?
surfealokesea
1
@surfealokesea Pytanie dotyczy HTTP i HTTPS, a odpowiedź lub osobiste doświadczenia dotyczące SMTP nie są istotne.
Markiz Lorne,
1
Tak, ale to nie tylko dla niego, ale dla innych użytkowników, którzy mają tę samą „nierozpoznaną wiadomość ssl”. +1 do ciebie, Thobith
sam1370
9

Otrzymałem ten sam komunikat o błędzie, gdy zapomniałem zalogować się do zapory firmowej, zanim wykonałem żądanie POST przez proxy.

Sójka
źródło
Musiałem zrobić to samo, chociaż byłem w firmie!
MonoThreaded
1
czy możesz wyjaśnić
pokrótce,
3

Mam ten sam błąd. to dlatego, że uzyskiwałem dostęp do portu https za pomocą protokołu http .. Problem został rozwiązany po zmianie protokołu http na https.

Soumyajit Swain
źródło
11
Nie, wystąpił błąd podczas uzyskiwania dostępu do portu HTTP przez HTTPS. Przeczytaj komunikat o błędzie. Połączyłeś się z celem w postaci zwykłego tekstu. Opisana sytuacja nie spowodowałaby wyjątku SSLE, ponieważ nie używałbyś SSL.
Markiz Lorne
1

Mam ten sam problem z aplikacją Java zbudowaną w Jdevelopr 11.1.1.7 IDE. Rozwiązałem ten problem, odznaczając użycie proxy formularza Właściwości projektu.

Możesz go znaleźć w: Project Properties -> (z lewego panelu) Run / Debug / Profile -> Kliknij (edytuj) z prawego panelu -> Tool Setting z lewego panelu -> odznacz opcję (Use Proxy).

Salman
źródło
1

Dodając to jako odpowiedź, ponieważ może to pomóc komuś później.

Musiałem zmusić jvm do użycia stosu IPv4 w celu rozwiązania błędu. Moja aplikacja działała w sieci firmowej, ale łącząc się z domu dawała ten sam wyjątek. Bez serwera proxy. Dodano argument jvm -Djava.net.preferIPv4Stack=truei wszystkie httpsżądania działały normalnie.

Basiljames
źródło
1

Jeśli korzystasz z lokalnego źródła, sugeruję użycie:

@Bean
public AmazonDynamoDB amazonDynamoDB() throws IOException {
    return AmazonDynamoDBClientBuilder.standard()
            .withCredentials(
                    new AWSStaticCredentialsProvider(
                            new BasicAWSCredentials("fake", "credencial")
                    )
            )
            .withClientConfiguration(new ClientConfigurationFactory().getConfig().withProtocol(Protocol.HTTP))
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("localhost:8443", "central"))
            .build();
}

Działa dla mnie przy użyciu testu jednostkowego.

Mam nadzieję, że to pomoc!

Henrique
źródło
0

Udało mi się teraz, zmieniłem ustawienie mojego konta Google, jak poniżej:

        System.out.println("Start");
        final String username = "[email protected]";
        final String password = "************";

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "465");
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

         Session session = Session.getInstance(props,
                  new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username, password);
                    }
                  });


        try {
            Transport transport=session.getTransport();
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("[email protected]"));//formBean.getString("fromEmail")
            message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("[email protected]"));
            message.setSubject("subject");//formBean.getString(
            message.setText("mailBody");
            transport.connect();
            transport.send(message, InternetAddress.parse("[email protected]"));//(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            System.out.println("e="+e);
            e.printStackTrace();
            throw new RuntimeException(e);

        }

Chociaż włączyłem SSL i TSL podczas uruchamiania programu w tym linku w tym samym poście. Spędziłem dużo czasu, ale niż sobie uświadomiłem i znalazłem ten link. I wykonałem 2 następujące kroki i ustawiłem kontrolę w Google. :

  • Wyłącz weryfikację dwuetapową (hasło i hasło jednorazowe)

  • Włączanie zezwalania na dostęp do mniej bezpiecznych aplikacji ( Zezwalaj na mniej bezpieczne aplikacje: WŁĄCZONE ).

Teraz mogę wysyłać pocztę używając powyższego programu.

Laxman G
źródło
3
Pytanie dotyczy HTTPS.
Markiz Lorne
0

Jak powiedział EJP, jest to komunikat wyświetlany z powodu wywołania protokołu innego niż HTTPS. Jeśli jesteś pewien, że to HTTPS, sprawdź ustawienia pomijania serwera proxy i na wypadek, gdybyś dodał adres URL hosta usługi internetowej do listy pomijanych serwerów proxy

Fabrizio Stellato
źródło
0

jeśli połączenie jest testem FTPS:

FTPSClient ftpClient = nowy FTPSClient (protokół, fałsz);

protokół = TLS, SSL i false = isImplicit.

Faxon
źródło
0

TUTAJ BARDZO WAŻNA ODPOWIEDŹ:

Po prostu zmieniasz ciąg adresu URL interfejsu API (w swojej metodzie) z https na http .. Może to być również przyczyna:

client.resource("http://192.168.0.100:8023/jaxrs/tester/tester");

zamiast

client.resource("https://192.168.0.100:8023/jaxrs/tester/tester");
Dan Ortega
źródło
-1

Otrzymałem ten sam problem i został on rozwiązany przez ustawienie „proxyUser” i „proxyPassword” we właściwościach systemu.

System.setProperty("http.proxyUser", PROXY_USER);
System.setProperty("http.proxyPassword", PROXY_PASSWORD);

wraz z „proxyHost” i „proxyPort”

System.setProperty("http.proxyHost", PROXY_ADDRESS);
System.setProperty("http.proxyPort", PROXY_PORT);

Mam nadzieję, że to zadziała.

Anil kumar
źródło
Będzie działać, jeśli używasz klienta Apache HTTP i masz wyjątek autoryzacji. Rozwiązanie problemu określonego przez PO nie będzie działać.
Markiz Lorne,
-1

rozwiązałem swój problem używając portu 25 i podążania za prop

mailSender.javaMailProperties.putAll([
                "mail.smtp.auth": "true",
                "mail.smtp.starttls.enable": "false",
                "mail.smtp.ssl.enable": "false",
                "mail.smtp.socketFactory.fallback": "true",
        ]);
srsajid
źródło
-1

Na wypadek, gdybyś biegał

  • Cisco AnyConnect Secure Mobility Agent
  • Cisco AnyConnect Web Security Agent

spróbuj zatrzymać usługi.

Nie jestem pewien, dlaczego głosowałem negatywnie na tę odpowiedź. W naszej sieci korporacyjnej JEST to rozwiązanie problemu.

rob2universe
źródło
-1

Mam podobny błąd podczas używania komponentu camel-mail do wysyłania e-maili przez gmail smtp.

Rozwiązanie zmieniało się z portu TLS (587) na port SSL (465), jak poniżej:

<route id="sendMail">
  <from uri="jason:toEmail"/>
  <convertBodyTo type="java.lang.String"/>
  <setHeader headerName="Subject"><constant>Something</constant></setHeader>
  <to uri="smtps://smtp.gmail.com:[email protected]&amp;password=mypw&amp;[email protected]&amp;debugMode=true&amp;mail.smtp.starttls.enable=true"/>
</route>
Cleber Jorge Amaral
źródło
Nie, rozwiązanie zmieniało się na port dla zwykłego tekstu .
Markiz Lorne
-2

Jeśli uruchamiasz proces Java z wiersza poleceń w Javie 6 lub starszej, dodanie tego przełącznika rozwiązało powyższy problem:

-Dhttps.protocols = "TLSv1"

MarkL
źródło
-3

Może wygasła ważność domyślnego certyfikatu. aby odnowić go przez konsolę administratora, wybierz „Bezpieczeństwo> Certyfikat SSL i zarządzanie kluczami> Magazyny kluczy i certyfikaty> NodeDefaultKeyStore> Certyfikaty osobiste”, wybierz alias „domyślny” i kliknij „odnów” po ponownym uruchomieniu WAS.

Mithat Bozkurt
źródło
1
Wygasły certyfikat nie powoduje tego wyjątku.
Markiz Lorne,
-3

Innym powodem może być „odmowa dostępu”, być może nie możesz uzyskać dostępu do URI i strony z odpowiedzią blokującą otrzymaną odpowiedź na dostęp do sieci wewnętrznej. Jeśli nie jesteś pewien, czy Twoja strefa aplikacji wymaga reguły zapory, spróbuj połączyć się z terminala, z wiersza poleceń. W przypadku systemu GNU / Linux lub Unix możesz spróbować wykonać to polecenie i zobaczyć, że wynik pochodzi z reguły blokowania lub naprawdę zdalnego adresu:echo | nc -v yazilimcity.net 443

oguzhankinik
źródło
Jeśli otrzymałeś jakąkolwiek stronę, część SSL działała idealnie i nie dostałbyś wyjątku cytowanego przez OP.
Markiz Lorne,
Nie otrzymuję żadnej strony z częścią SSL, otrzymałem odpowiedź HTTP sieci wewnętrznej, że specjalnie przygotowana strona. W tym scenariuszu uzyskuję dostęp do strony HTTP za pośrednictwem żądania HTTPS, więc otrzymałem ten wyjątek. Po zmianie reguły sieci ten wyjątek również został rozwiązany samodzielnie.
oguzhankinik