Pesan SSL yang tidak dikenal, koneksi plaintext? Pengecualian

172

Saya memiliki paket yang memenuhi java untuk berbicara dengan server https di internet. Menjalankan kompilasi memberikan pengecualian berikut:

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)

Saya pikir ini karena koneksi yang dibuat dengan mesin klien tidak aman. Apakah ada cara untuk mengkonfigurasi mesin atau port lokal agar dapat terhubung ke server https jarak jauh?

karthi
sumber

Jawaban:

238

Saya pikir ini karena koneksi yang dibuat dengan mesin klien tidak aman.

Karena Anda berbicara dengan server HTTP, bukan server HTTPS. Mungkin Anda tidak menggunakan nomor port yang benar untuk HTTPS.

Marquis dari Lorne
sumber
7
Saya memiliki kesalahan yang sama, dan saya menyelesaikannya ketika saya mulai menggunakan http, bukan https. Tetapi ketika saya menempatkan tautan di browser dengan https, ia berfungsi! Dan saya perlu melakukan kueri yang aman. Ada ide tentang bagaimana saya bisa menyelesaikan masalah?
ccoutinho
9
@rsy Ketika Anda 'meletakkan tautan ... dengan https' peramban akan berubah ke port 443 untuk Anda. Anda dapat melakukan hal yang sama sendiri. Memang HttpURLConnectionakan secara otomatis melakukannya untuk Anda, jika Anda tidak menentukan port sama sekali.
Marquis of Lorne
Saya berasumsi bahwa Anda dapat mengatur port apa saja pada server Anda menjadi HTTPS, tidak harus port tertentu?
1
@KarlSherwin Ini bisa berupa port apa saja yang Anda suka, tergantung reservasi, tetapi jika tidak 443, Anda harus mengangkutnya di sekitar Anda di semua URL Anda.
Marquis of Lorne
18
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

Anda harus memiliki nama domain SMTP lokal yang akan menghubungi server email dan membuat koneksi baru juga Anda harus mengubah properti SSL dalam pemrograman Anda di bawah ini

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

 props.put("mail.smtp.socketFactory.fallback", "true"); // Should be true
Thobith
sumber
10
Dia berbicara HTTPS, bukan SMTP. -1
Marquis of Lorne
2
Dalam kasus saya yang berhasil, terima kasih! javax.mail.MessagingException: Tidak dapat terhubung ke host SMTP: mail.livemusicgo.com, port: 25; pengecualian bersarang adalah: javax.net.ssl.SSLException: Pesan SSL yang tidak dikenal, koneksi plaintext?
surfealokesea
1
@surfealokesea Pertanyaannya adalah tentang HTTP dan HTTPS, dan jawaban atau pengalaman pribadi tentang SMTP tidak relevan.
Marquis of Lorne
1
Ya tapi ini bukan hanya untuknya tetapi untuk pengguna lain yang memiliki 'pesan ssl tidak dikenal' yang sama ini. +1 untuk Anda, Thobith
sam1370
9

Saya mendapat pesan kesalahan yang sama ketika saya lupa masuk ke firewall perusahaan, sebelum melakukan permintaan POST melalui proxy.

Jay
sumber
Saya harus melakukan hal yang sama walaupun saya berada di dalam perusahaan!
MonoThreaded
1
bisa tolong jelaskan secara singkat bagaimana menyelesaikannya, saya juga menghadapi masalah yang sama di perusahaan saya kan
Nitesh
3

Saya mendapat kesalahan yang sama. itu karena saya mengakses port https menggunakan http .. Masalahnya terpecahkan ketika saya mengubah http ke https.

Soumyajit Swain
sumber
11
Tidak, Anda mendapat kesalahan saat mengakses port HTTP melalui HTTPS. Baca pesan kesalahan. Anda terhubung ke target teks biasa. Situasi yang Anda gambarkan tidak akan menyebabkan SSLException, karena Anda tidak akan menggunakan SSL.
Marquis of Lorne
1

Saya menghadapi masalah yang sama dari aplikasi Java yang dibangun di Jdevelopr 11.1.1.7 IDE. Saya memecahkan masalah dengan menghapus centang penggunaan bentuk proksi properti Proyek.

Anda dapat menemukannya di berikut ini: Properti Proyek -> (dari panel kiri) Jalankan / Debug / Profil -> Klik (edit) dari panel kanan -> Pengaturan Perangkat dari panel kiri -> hapus centang opsi (Gunakan Proksi).

Salman
sumber
1

Menambahkan ini sebagai jawaban karena dapat membantu seseorang nantinya.

Saya harus memaksa jvm untuk menggunakan tumpukan IPv4 untuk menyelesaikan kesalahan. Aplikasi saya dulu bekerja di dalam jaringan perusahaan, tetapi saat terhubung dari rumah itu memberikan pengecualian yang sama. Tidak ada proxy yang terlibat. Menambahkan argumen jvm -Djava.net.preferIPv4Stack=truedan semua httpspermintaan berperilaku normal.

basiljames
sumber
1

Jika Anda menjalankan lokal menggunakan pegas saya sarankan menggunakan:

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

Ini bekerja untuk saya menggunakan unit test.

Semoga ini bisa membantu!

Henrique
sumber
0

Ini bekerja untuk saya sekarang, saya telah mengubah pengaturan akun google saya seperti di bawah ini:

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

        }

Meskipun saya telah mengaktifkan SSL dan TSL saat menjalankan program di tautan yang sama. Saya menghabiskan banyak waktu tetapi saya tidak menyadarinya dan menemukan tautan ini. Dan dilakukan 2 langkah berikut dan pengaturan kontrol di google. :

  • Nonaktifkan verifikasi 2 langkah (kata sandi dan OTP)

  • Mengaktifkan untuk memungkinkan mengakses aplikasi yang kurang aman ( Izinkan aplikasi yang kurang aman: ON. )

Sekarang saya dapat mengirim email menggunakan program di atas.

Laxman G
sumber
3
Pertanyaannya adalah tentang HTTPS.
Marquis of Lorne
0

Seperti yang dikatakan EJP, itu adalah pesan yang ditampilkan karena panggilan ke protokol non-https. Jika Anda yakin itu adalah HTTPS, periksa pengaturan proxy bypass Anda, dan jika-kalau tambahkan url host layanan web Anda ke daftar proxy bypass

Fabrizio Stellato
sumber
0

jika koneksi adalah tes FTPS:

FTPSClient ftpClient = FTPSClient baru (protokol, false);

protokol = TLS, SSL dan false = isImplicit.

Faxon
sumber
0

DI SINI JAWABAN SANGAT PENTING:

Anda cukup mengubah String URL API (dalam metode Anda) dari https ke http .. Ini juga bisa menjadi penyebab:

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

dari pada

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

Saya mendapat masalah yang sama dan diselesaikan dengan menetapkan "proxyUser" dan "proxyPassword" di properti sistem.

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

bersama dengan "proxyHost" dan "proxyPort"

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

Semoga ini berhasil.

Anil kumar
sumber
Ini akan berfungsi jika Anda menggunakan klien HTTP Apache dan Anda mendapat pengecualian otorisasi. Ini tidak akan berhasil untuk memecahkan masalah yang dinyatakan oleh OP.
Marquis of Lorne
-1

saya memecahkan masalah saya menggunakan port 25 dan Prop berikut

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

Jika Anda menjalankan

  • Cisco AnyConnect Secure Mobility Agent
  • Agen Keamanan Web Cisco AnyConnect

coba hentikan layanannya.

Tidak yakin mengapa saya mendapat suara turun untuk jawaban ini. Dalam jaringan perusahaan kami, ini ADALAH solusi untuk masalah ini.

rob2universe
sumber
-1

Saya mengalami kesalahan serupa menggunakan komponen camel-mail untuk mengirim email melalui gmail smtp.

Solusinya berubah dari port TLS (587) ke port SSL (465) seperti di bawah ini:

<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
sumber
Tidak, solusinya berubah menjadi port plaintext .
Marquis of Lorne
-2

Jika Anda menjalankan proses Java dari baris perintah di Java 6 atau sebelumnya, menambahkan sakelar ini memecahkan masalah di atas untuk saya:

-Dhttps.protocols = "TLSv1"

MarkL
sumber
-3

Mungkin cerficate default Anda telah kedaluwarsa. untuk memperbaruinya melalui konsol admin, buka "Keamanan> Sertifikat SSL dan manajemen kunci> Penyimpanan dan sertifikat utama> NodeDefaultKeyStore> Sertifikat pribadi" pilih alias "default" dan klik "perbarui" setelah kemudian restart WS.

Mithat Bozkurt
sumber
1
Sertifikat kadaluarsa tidak menyebabkan pengecualian ini.
Marquis of Lorne
-3

Alasan lain adalah mungkin "akses ditolak", mungkin Anda tidak dapat mengakses ke URI dan menerima halaman tanggapan pemblokiran untuk akses jaringan internal. Jika Anda tidak yakin zona aplikasi Anda memerlukan aturan firewall, coba terhubung dari terminal, baris perintah. Untuk GNU / Linux atau Unix, Anda dapat mencoba menjalankan seperti perintah ini dan melihat hasilnya berasal dari aturan pemblokiran atau alamat yang sangat jauh:echo | nc -v yazilimcity.net 443

oguzhankinik
sumber
Jika Anda menerima halaman apa pun, bagian SSL berfungsi dengan baik dan Anda tidak akan mendapatkan pengecualian yang dikutip oleh OP.
Marquis of Lorne
Saya tidak menerima jenis halaman apa pun dari bagian SSL, saya menerima respons HTTP jaringan internal yang dibuat khusus. Untuk skenario ini, saya mengakses halaman HTTP melalui permintaan HTTPS jadi saya menerima pengecualian ini. Setelah aturan jaringan berubah, pengecualian ini juga dapat diselesaikan sendiri.
oguzhankinik