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?

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.


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

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.


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.


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).


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.


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!


0

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

        System.out.println("Start");
        final String username = "myemail@gmail.com";
        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("myemail@gmail.com"));//formBean.getString("fromEmail")
            message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("myemail@gmail.com"));
            message.setSubject("subject");//formBean.getString(
            message.setText("mailBody");
            transport.connect();
            transport.send(message, InternetAddress.parse("myemail@gmail.com"));//(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.


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


0

jeśli połączenie jest testem FTPS:

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

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



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");

-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.


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",
        ]);

-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.


-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:465?username=myemail@gmail.com&amp;password=mypw&amp;to=someemail@gmail.com&amp;debugMode=true&amp;mail.smtp.starttls.enable=true"/>
</route>

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"


-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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.