Nicht erkannte SSL-Nachricht, Klartextverbindung? Ausnahme

171

Ich habe ein Java-konformes Paket, um mit dem https-Server im Internet zu sprechen. Das Ausführen der Kompilierung gibt die folgende Ausnahme:

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)

Ich denke, das liegt daran, dass die Verbindung zum Client-Computer nicht sicher ist. Gibt es eine Möglichkeit, den lokalen Computer oder die Ports zu konfigurieren, um eine Verbindung zum Remote-https-Server herzustellen?

karthi
quelle

Antworten:

237

Ich denke, das liegt daran, dass die Verbindung zum Client-Computer nicht sicher ist.

Dies liegt an der Tatsache, dass Sie mit einem HTTP-Server sprechen, nicht mit einem HTTPS-Server. Wahrscheinlich haben Sie nicht die richtige Portnummer für HTTPS verwendet.

Marquis von Lorne
quelle
7
Ich habe den gleichen Fehler und habe ihn behoben, als ich anfing, http anstelle von https zu verwenden. Aber wenn ich den Link mit https in den Browser setze, funktioniert es! Und ich muss eine sichere Abfrage durchführen. Irgendeine Idee, wie ich das Problem lösen kann?
ccoutinho
9
@rsy Wenn Sie den Link "mit https" platziert haben, hat sich der Browser für Sie auf Port 443 geändert. Sie können das gleiche selbst tun. In der Tat HttpURLConnectionwird es automatisch für Sie tun, wenn Sie überhaupt keinen Port angeben.
Marquis von Lorne
Ich gehe davon aus, dass Sie jeden Port auf Ihrem Server als HTTPS einrichten können. Es muss kein bestimmter Port sein.
1
@KarlSherwin Es kann jeder Port sein, den Sie mögen, vorbehaltlich Reservierungen, aber wenn es nicht 443 ist, müssen Sie das in all Ihren URLs um sich herum karren.
Marquis von Lorne
18
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

Sie sollten einen lokalen SMTP-Domänennamen haben, der den Mailserver kontaktiert und eine neue Verbindung herstellt. Sie sollten die SSL-Eigenschaft in Ihrer Programmierung unten ändern

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

 props.put("mail.smtp.socketFactory.fallback", "true"); // Should be true
Thobith
quelle
10
Er spricht HTTPS, nicht SMTP. -1
Marquis von Lorne
2
In meinem Fall hat das funktioniert, danke! javax.mail.MessagingException: Es konnte keine Verbindung zum SMTP-Host hergestellt werden: mail.livemusicgo.com, Port: 25; verschachtelte Ausnahme ist: javax.net.ssl.SSLException: Nicht erkannte SSL-Nachricht, Klartextverbindung?
Surfealokesea
1
@surfealokesea Die Frage bezieht sich auf HTTP und HTTPS, und eine Antwort oder eine persönliche Erfahrung zu SMTP ist nicht relevant.
Marquis von Lorne
1
Ja, aber dies ist nicht nur für ihn, sondern auch für andere Benutzer, die dieselbe "nicht erkannte SSL-Nachricht" haben. +1 an Sie, Thobith
sam1370
9

Ich habe dieselbe Fehlermeldung erhalten, als ich vergessen habe, mich bei der Firewall des Unternehmens anzumelden, bevor ich eine POST-Anforderung über einen Proxy ausgeführt habe.

Jay
quelle
Ich musste das Gleiche tun, obwohl ich in der Firma war!
MonoThreaded
1
Können Sie mir bitte kurz erklären, wie Sie das Problem lösen können? Auch ich
stehe
3

Ich habe den gleichen Fehler bekommen. Dies lag daran, dass ich über http auf den https-Port zugegriffen habe. Das Problem wurde behoben, als ich http in https geändert habe.

Soumyajit Swain
quelle
11
Nein, Sie haben den Fehler beim Zugriff auf den HTTP-Port über HTTPS erhalten. Lesen Sie die Fehlermeldung. Sie haben eine Verbindung zu einem Klartextziel hergestellt. Die von Ihnen beschriebene Situation hätte keine SSLE-Ausnahme verursacht, da Sie kein SSL verwendet hätten.
Marquis von Lorne
1

Ich habe das gleiche Problem mit der in Jdevelopr 11.1.1.7 IDE erstellten Java-Anwendung. Ich habe das Problem gelöst, indem ich die Verwendung der Proxy-Formular-Projekteigenschaften deaktiviert habe.

Sie finden es im Folgenden: Projekteigenschaften -> (aus dem linken Bereich) Ausführen / Debuggen / Profil -> Klicken (Bearbeiten) im rechten Bereich -> Werkzeugeinstellung im linken Bereich -> Deaktivieren Sie die Option (Proxy verwenden).

Salman
quelle
1

Fügen Sie dies als Antwort hinzu, da es später jemandem helfen könnte.

Ich musste jvm zwingen, den IPv4-Stack zu verwenden, um den Fehler zu beheben. Meine Anwendung arbeitete früher im Unternehmensnetzwerk, aber während der Verbindung von zu Hause aus gab es dieselbe Ausnahme. Kein Proxy beteiligt. Das Argument jvm wurde hinzugefügt -Djava.net.preferIPv4Stack=trueund alle httpsAnforderungen verhielten sich normal.

Basiljames
quelle
1

Wenn Sie mit Spring lokal arbeiten, würde ich Folgendes empfehlen:

@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();
}

Es funktioniert bei mir mit Unit-Test.

Hoffe es ist Hilfe!

Henrique
quelle
0

Es hat jetzt bei mir funktioniert. Ich habe die Einstellung meines Google-Kontos wie folgt geändert:

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

        }

Obwohl ich SSL und TSL aktiviert habe, während ich das Programm in diesem Link desselben Beitrags ausgeführt habe. Ich verbringe viel Zeit, aber als ich merkte und diesen Link fand. Und 2 folgende Schritte ausgeführt und Kontrolle in Google einstellen. ::

  • Deaktivieren Sie die Bestätigung in zwei Schritten (Kennwort und OTP).

  • Aktivieren, um den Zugriff auf weniger sichere Apps zu ermöglichen ( Weniger sichere Apps zulassen: EIN. )

Jetzt kann ich mit dem oben genannten Programm E-Mails senden.

Laxman G.
quelle
3
Die Frage betrifft HTTPS.
Marquis von Lorne
0

Wie EJP sagte, handelt es sich um eine Nachricht, die aufgrund eines Aufrufs eines Nicht-https-Protokolls angezeigt wird. Wenn Sie sicher sind, dass es sich um HTTPS handelt, überprüfen Sie Ihre Bypass-Proxy-Einstellungen und fügen Sie für den Fall, dass Sie Ihre Webservice-Host-URL zur Bypass-Proxy-Liste hinzufügen

Fabrizio Stellato
quelle
0

Wenn die Verbindung FTPS-Test ist:

FTPSClient ftpClient = neuer FTPSClient (Protokoll, falsch);

protocol = TLS, SSL und false = isImplicit.

Faxon
quelle
0

Bei der Verwendung von Google Mail war diese Ausnahme aufgetreten.

Um Google Mail nutzen zu können, musste ich "Weniger sichere Apps zulassen" aktivieren .

Diese Google Mail-Einstellung finden Sie unter https://www.google.com/settings/security/lesssecureapps, nachdem Sie sich beim Google Mail-Konto angemeldet haben.

Jose1755
quelle
0

HIER EINE SEHR WICHTIGE ANTWORT:

Sie ändern einfach Ihre API-URL-Zeichenfolge (in Ihrer Methode) von https in http. Dies kann auch die Ursache sein:

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

anstatt

client.resource("https://192.168.0.100:8023/jaxrs/tester/tester");
Dan Ortega
quelle
-1

Ich habe das gleiche Problem und es wurde behoben, indem "proxyUser" und "proxyPassword" in den Systemeigenschaften festgelegt wurden.

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

zusammen mit "proxyHost" und "proxyPort"

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

Hoffe es wird funktionieren.

Anil kumar
quelle
Dies funktioniert, wenn Sie den Apache HTTP-Client verwenden und eine Autorisierungsausnahme erhalten haben. Es wird nicht funktionieren, um das vom OP angegebene Problem zu lösen.
Marquis von Lorne
-1

Ich habe mein Problem mit Port 25 und der folgenden Requisite gelöst

mailSender.javaMailProperties.putAll([
                "mail.smtp.auth": "true",
                "mail.smtp.starttls.enable": "false",
                "mail.smtp.ssl.enable": "false",
                "mail.smtp.socketFactory.fallback": "true",
        ]);
srsajid
quelle
-1

Falls du rennst

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

Versuchen Sie, die Dienste zu stoppen.

Ich bin mir nicht sicher, warum ich für diese Antwort eine negative Stimme bekommen habe. In unserem Unternehmensnetzwerk ist dies die Lösung für das Problem.

rob2universe
quelle
-1

Ich habe einen ähnlichen Fehler bei der Verwendung der Camel-Mail-Komponente zum Senden von E-Mails per Google Mail-SMTP.

Die Lösung wurde wie folgt von TLS-Port (587) zu SSL-Port (465) geändert:

<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
quelle
Nein, die Lösung wurde in einen Klartext- Port geändert .
Marquis von Lorne
-2

Wenn Sie den Java-Prozess über die Befehlszeile unter Java 6 oder früher ausführen, hat das Hinzufügen dieses Schalters das oben genannte Problem für mich gelöst:

-Dhttps.protocols = "TLSv1"

MarkL
quelle
-3

Möglicherweise ist Ihr Standardzertifikat abgelaufen. Um es über die Administratorkonsole zu erneuern, gehen Sie zu "Sicherheit> SSL-Zertifikat- und Schlüsselverwaltung> Schlüsselspeicher und Zertifikate> NodeDefaultKeyStore> Persönliche Zertifikate". Wählen Sie den Alias ​​"Standard" und klicken Sie nach dem Neustart von WAS auf "Erneuern".

Mithat Bozkurt
quelle
1
Ein abgelaufenes Zertifikat verursacht diese Ausnahme nicht.
Marquis von Lorne
-3

Ein weiterer Grund ist möglicherweise "Zugriff verweigert". Möglicherweise können Sie nicht auf die URI zugreifen und haben eine blockierende Antwortseite für den internen Netzwerkzugriff erhalten. Wenn Sie nicht sicher sind, ob Ihre Anwendungszone eine Firewall-Regel benötigt, versuchen Sie, eine Verbindung über das Terminal und die Befehlszeile herzustellen. Unter GNU / Linux oder Unix können Sie versuchen, diesen Befehl auszuführen, um festzustellen, ob das Ergebnis von der Blockierungsregel oder der wirklich entfernten Adresse stammt:echo | nc -v yazilimcity.net 443

oguzhankinik
quelle
Wenn Sie irgendeine Seite erhalten hätten, hätte der SSL-Teil einwandfrei funktioniert und Sie hätten die vom OP angeführte Ausnahme nicht erhalten.
Marquis von Lorne
Ich erhalte keine Seite des SSL-Teils, sondern eine interne Netzwerk-HTTP-Antwort auf diese speziell vorbereitete Seite. In diesem Szenario greife ich über eine HTTPS-Anforderung auf die HTTP-Seite zu, sodass ich diese Ausnahme erhalten habe. Nachdem sich die Netzwerkregel geändert hat, wurde diese Ausnahme ebenfalls selbst behoben.
Oguzhankinik