Нерозпізнане повідомлення 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?

Відповіді:


238

Я думаю, це пов’язано з тим, що встановлений з клієнтом апарат не є безпечним.

Це пов’язано з тим, що ви спілкуєтесь із сервером 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 вам, Thobith
sam1370

9

Я отримав те саме повідомлення про помилку, коли забув увійти в брандмауер компанії, перш ніж виконувати запит POST через проксі.


Я повинен був зробити те саме, хоча я був всередині компанії!
MonoTrereed

1
Ви можете, будь ласка, пояснити коротко, як вирішити, я теж зіткнувся з тією ж проблемою в моїй компанії право о
Нітеш

3

Я отримав таку ж помилку. це було тому, що я отримував доступ до порту https за допомогою http .. Проблема вирішилася, коли я змінив http на https.


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

1

Я стикаюся з тією ж проблемою від програми Java, побудованої в IDE Jdevelopr 11.1.1.7. Я вирішив цю проблему, знявши прапорець із використанням проксі-властивостей Project властивостей.

Ви можете знайти його в наступних випадках: Властивості проекту -> (з лівої панелі) Виконати / Налагодити / Профіль -> Клацніть (редагувати) форму правої панелі -> Налаштування інструменту на лівій панелі -> зніміть прапорець (Використовувати проксі).


1

Додавши це як відповідь, оскільки це може допомогти комусь пізніше.

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


1

Якщо ви використовуєте локальний за допомогою весни, я б запропонував використовувати:

@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 під час запуску програми в цьому посиланні того ж посту. Я витрачаю багато часу, але ніж я зрозумів і знайшов це посилання. І виконано два наступні кроки та встановлення керування в google. :

  • Вимкнути двоетапну перевірку (пароль та OTP)

  • Увімкнення доступу до менш захищеного додатка ( Дозволити менш захищені програми: УВІМКНЕНО. )

Тепер я можу надсилати пошту за допомогою вищевказаної програми.


3
Питання стосується HTTPS.
Маркіз Лорн

0

Як сказав EJP, це повідомлення відображається через дзвінок на протокол, який не є https. Якщо ви впевнені, що це HTTPS, перевірте налаштування обхідного проксі-сервера, і, якщо ви додасте URL-адресу хоста веб-сервісу до списку обхідних проксі


0

якщо підключення є тестом FTPS:

FTPSClient ftpClient = новий FTPSClient (протокол, помилка);

протокол = TLS, SSL та false = isImplicit.



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
  • Агент веб-безпеки Cisco AnyConnect

спробуйте зупинити послугу.

Не впевнений, чому я отримав протилежний голос за цю відповідь. У нашій корпоративній мережі це вирішення проблеми.


-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 працювала ідеально, і ви не отримали б виняток, про який йдеться в ОП.
Маркіз Лорн

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