Нераспознанное сообщение SSL, текстовое соединение? исключение


172

У меня есть пакет, соответствующий требованиям Java, для общения с сервером https в сети. Запуск компиляции дает следующее исключение:

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)

Я думаю, что это связано с тем, что соединение с клиентским компьютером не является безопасным. Есть ли способ настроить локальный компьютер или порты для подключения к удаленному серверу https?

Ответы:


239

Я думаю, что это связано с тем, что соединение с клиентским компьютером не является безопасным.

Это связано с тем, что вы используете HTTP-сервер, а не HTTPS-сервер. Возможно, вы не использовали правильный номер порта для HTTPS.


7
У меня та же ошибка, и я решил, когда я начал использовать http вместо https. Но когда я размещаю ссылку в браузере с https, это работает! И мне нужно выполнить безопасный запрос. Есть идеи, как решить проблему?
ccoutinho

9
@rsy Когда вы «разместили ссылку ... с https», браузер переключился бы на порт 443 для вас. Вы можете сделать то же самое самостоятельно. Действительно HttpURLConnection, автоматически сделает это за вас, если вы вообще не укажете порт.
маркиз Лорн

Я предполагаю, что вы можете настроить любой порт на вашем сервере, чтобы быть HTTPS, это не должен быть определенный порт?

1
@KarlSherwin Это может быть любой порт, который вам нравится, при условии бронирования, но если это не 443, вам нужно будет добавить его во все ваши URL.
Маркиз Лорн

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

У вас должно быть локальное имя домена SMTP, которое свяжется с почтовым сервером и установит новое соединение, а также вы должны изменить свойство SSL в ваших программах ниже.

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

 props.put("mail.smtp.socketFactory.fallback", "true"); // Should be true

10
Он говорит HTTPS, а не SMTP. -1
Маркиз Лорн

2
В моем случае это сработало, спасибо! javax.mail.MessagingException: не удалось подключиться к узлу SMTP: mail.livemusicgo.com, порт: 25; Вложенное исключение: javax.net.ssl.SSLException: Нераспознанное сообщение SSL, текстовое соединение?
Surfealokesea

1
@surfealokesea Вопрос касается HTTP и HTTPS, и ответ или личный опыт о SMTP не имеет значения.
Маркиз Лорн

1
Да, но это не только для него, это для других пользователей, которые имеют то же самое «нераспознанное сообщение ssl». +1 тебе, Тобит
sam1370

9

Я получил то же сообщение об ошибке, когда забыл войти в брандмауэр компании перед выполнением запроса POST через прокси-сервер.


Я должен был сделать то же самое, хотя я был в компании!
MonoThreaded

1
не могли бы вы вкратце объяснить, как решить, я тоже столкнулся с той же проблемой в моей компании прямо сейчас
Nitesh

3

Я получил ту же ошибку. это было, потому что я получал доступ к порту https через http. Проблема была решена, когда я изменил http на https.


11
Нет, вы получили ошибку при доступе к HTTP-порту через HTTPS. Прочитайте сообщение об ошибке. Вы подключились к цели в виде открытого текста. Описанная вами ситуация не вызвала бы исключение SSLEx, поскольку вы не использовали бы SSL.
Маркиз Лорн

1

Я сталкиваюсь с той же проблемой из приложения Java, встроенного в среду разработки Jdevelopr 11.1.1.7. Я решил проблему, сняв флажок с использованием прокси-формы свойств проекта.

Вы можете найти его в следующем: Свойства проекта -> (из левой панели) Выполнить / Отладка / Профиль -> Щелкните (изменить) на правой панели -> Настройка инструмента на левой панели -> снимите флажок (Использовать прокси).


1

Добавление этого в качестве ответа, поскольку это может помочь кому-то позже.

Мне пришлось заставить jvm использовать стек IPv4 для устранения ошибки. Мое приложение раньше работало в сети компании, но при подключении из дома оно давало то же исключение. Никакой прокси не задействован. Добавил аргумент jvm -Djava.net.preferIPv4Stack=trueи все httpsзапросы работали нормально.


1

Если вы работаете локально, используя spring, я бы предложил использовать:

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

Это работает для меня с помощью модульного теста.

Надеюсь, это поможет!


0

Теперь это работает для меня, я изменил настройки моей учетной записи Google, как показано ниже:

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

        }

Хотя я включил SSL и TSL при запуске программы в этой ссылке того же поста. Я трачу много времени, но потом я понял и нашел эту ссылку. И сделали 2 следующих шага и настройку управления в гугле. :

  • Отключить двухэтапную проверку (пароль и OTP)

  • Включение разрешения доступа к менее защищенному приложению ( Разрешить менее защищенные приложения: включено. )

Теперь я могу отправлять почту, используя вышеуказанную программу.


3
Вопрос по HTTPS.
Маркиз Лорн

0

Как сказал EJP, это сообщение отображается из-за вызова не-https протокола. Если вы уверены, что это HTTPS, проверьте настройки своего обходного прокси-сервера и, в случае, добавьте URL своего хоста веб-сервиса в список обходного прокси-сервера.


0

если соединение является тестом FTPS:

FTPSClient ftpClient = новый FTPSClient (протокол, ложь);

protocol = TLS, SSL и false = isImplicit.


0

Я столкнулся с этим исключением при использовании Gmail.

Чтобы использовать Gmail, мне пришлось включить «Разрешить менее безопасные приложения» .

Этот параметр Gmail можно найти по адресу https://www.google.com/settings/security/lesssecureapps после входа в учетную запись Gmail .


0

ЗДЕСЬ ОЧЕНЬ ВАЖНЫЙ ОТВЕТ:

Вы просто измените свою строку URL-адреса API (в вашем методе) с https на http. Это также может быть причиной:

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

вместо того

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

-1

Я получил ту же проблему, и она была решена путем установки «proxyUser» и «proxyPassword» в свойствах системы.

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

вместе с "proxyHost" и "proxyPort"

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

Надеюсь, это сработает.


Это будет работать, если вы используете HTTP-клиент Apache и получили исключение авторизации. Это не поможет решить проблему, указанную в ОП.
Маркиз Лорн

-1

я решил свою проблему, используя порт 25 и следующий проп

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

-1

Если вы работаете

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

попробуйте остановить сервис (ы).

Не уверен, почему я получил отрицательный голос за этот ответ. В нашей корпоративной сети это является решением проблемы.


-1

У меня похожая ошибка при использовании компонента верблюжьей почты для отправки сообщений электронной почты через gmail smtp.

Решение менялось с порта TLS (587) на порт SSL (465), как показано ниже:

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

Нет, решение было изменено на порт открытого текста .
Маркиз Лорн

-2

Если вы запускаете процесс Java из командной строки на Java 6 или более ранней версии, добавление этого параметра решило проблему, описанную выше для меня:

-Dhttps.protocols = "TLSv1"


-3

Возможно, ваш сертификат по умолчанию истек. чтобы обновить его через консоль администратора, перейдите в раздел «Безопасность> Управление сертификатами и ключами SSL> Хранилища ключей и сертификаты> NodeDefaultKeyStore> Персональные сертификаты», выберите псевдоним «по умолчанию» и нажмите «обновить» после, а затем перезапустите WAS.


1
Сертификат с истекшим сроком действия не вызывает этого исключения.
Маркиз Лорн

-3

Другой причиной может быть «отказано в доступе», возможно, вы не можете получить доступ к URI и полученной странице ответа о блокировке для доступа к внутренней сети. Если вы не уверены, что вашей зоне приложения нужно правило брандмауэра, попробуйте подключиться из терминала, из командной строки. Для GNU / Linux или Unix, вы можете попробовать выполнить так, как эта команда, и посмотреть, что результат исходит из правила блокировки или действительно удаленного адреса:echo | nc -v yazilimcity.net 443


Если вы получили какую-либо страницу, часть SSL работала отлично, и вы не получили бы исключение, указанное OP.
Маркиз Лорн

Я не получаю какую-либо страницу в части SSL, я получил внутренний HTTP-ответ на эту специально подготовленную страницу. Для этого сценария я обращаюсь к странице HTTP через запрос HTTPS, поэтому я получил это исключение. После изменения сетевого правила это исключение также разрешается самостоятельно.
огужанкиник
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.