Tanınmayan SSL mesajı, düz metin bağlantısı? İstisna


172

Net https sunucusu ile konuşmak için java uyumlu bir paket var. Derlemeyi çalıştırmak aşağıdaki istisnayı verir:

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)

Bunun istemci makine ile kurulan bağlantı güvenli olmadığından kaynaklandığını düşünüyorum. Uzak https sunucusuna bağlanmak için yerel makineyi veya bağlantı noktalarını yapılandırmanın herhangi bir yolu var mı?

Yanıtlar:


239

Bunun istemci makine ile kurulan bağlantı güvenli olmadığından kaynaklandığını düşünüyorum.

Bunun nedeni, bir HTTPS sunucusuyla değil bir HTTP sunucusuyla konuşmanızdır. Muhtemelen HTTPS için doğru port numarasını kullanmadınız.


7
Aynı hatayı aldım ve https yerine http kullanmaya başladığımda çözüldüm. Ama bağlantıyı https ile tarayıcıya yerleştirdiğimde işe yarıyor! Ve güvenli bir sorgu yapmam gerekiyor. Sorunu nasıl çözebilirim hakkında herhangi bir fikrim var mı?
ccoutinho

9
@rsy Bağlantıyı 'https ile' yerleştirdiğinizde tarayıcı sizin için 443 numaralı bağlantı noktasına değişecektir. Aynı şeyi kendiniz de yapabilirsiniz. Gerçekten de HttpURLConnection, bir port belirtmezseniz, bunu sizin için otomatik olarak yapar.
Lorne Marquis

Sunucunuzdaki herhangi bir bağlantı noktasını HTTPS olarak ayarlayabileceğinizi varsayıyorum, belirli bir bağlantı noktası olması gerekmez mi?

1
@KarlSherwin Rezervasyonlara tabi olarak istediğiniz herhangi bir liman olabilir, ancak 443 değilse, tüm URL'lerinizde etrafınızda alışveriş yapmanız gerekir.
Lorne Marquis

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

Posta sunucusuyla iletişim kuracak ve yeni bir bağlantı kuracak yerel bir SMTP etki alanı adınızın olması gerekir; ayrıca aşağıdaki programlamanızda SSL özelliğini değiştirmeniz gerekir

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

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

10
SMTP değil HTTPS konuşuyor. -1
Lorne Marquis

2
Benim durumumda işe yaradı, teşekkürler! javax.mail.MessagingException: SMTP ana bilgisayarına bağlanılamadı: mail.livemusicgo.com, bağlantı noktası: 25; iç içe kural dışı durum: javax.net.ssl.SSLException: Tanınmayan SSL mesajı, düz metin bağlantısı?
surfealokesea

1
@surfealokesea Soru HTTP ve HTTPS ile ilgilidir ve SMTP ile ilgili bir cevap veya kişisel deneyim ilgili değildir.
Lorne Marquis

1
Evet ama bu sadece onun için değil, aynı 'tanınmayan SSL mesajına' sahip olan diğer kullanıcılar içindir. +1 size, Thobith
sam1370

9

Bir proxy üzerinden POST isteği gerçekleştirmeden önce şirket güvenlik duvarına giriş yapmayı unuttuğumda aynı hata iletisini aldım.


Şirket içinde olmama rağmen aynı şeyi yapmak zorundaydım!
Mono Dişli

1
kısaca nasıl çözüleceğini lütfen açıklayabilir misiniz, ben de benim şirket sağ ow aynı sorunla karşı karşıya
Nitesh

3

Aynı hatayı aldım. http kullanarak https portuna erişiyordum çünkü http'yi https olarak değiştirdiğimde sorun çözüldü.


11
Hayır, HTTPS üzerinden HTTP bağlantı noktasına erişirken hata alıyorsunuz. Hata mesajını okuyun. Bir düz metin hedefine bağlandınız. Açıkladığınız durum SSL kullanmadığınız için SSLException durumuna neden olmaz.
Lorne Marquis

1

Aynı sorun Jdevelopr 11.1.1.7 IDE inşa Java uygulaması ile karşı karşıya. Proxy form Project özelliklerinin kullanımını kaldırarak sorunu çözdüm.

Aşağıdakileri bulabilirsiniz: Proje Özellikleri -> (sol bölmeden) Sağ panelden Çalıştır / Hata Ayıkla / Profil -> Tıkla (düzenle) - sol panelden> Araç Ayarı -> (Proxy Kullan) seçeneğinin işaretini kaldırın.


1

Bunu daha sonra birisine yardımcı olabileceği için cevap olarak eklemek.

Hatayı gidermek için IPv4 yığını kullanmak için jvm zorlamak zorunda kaldı. Uygulamam şirket ağında çalışıyordu, ancak evden bağlanırken aynı istisnayı verdi. Vekil sunucu yok. Jvm argümanı eklendi -Djava.net.preferIPv4Stack=trueve tüm httpsistekler normal davranıyordu.


1

Bahar kullanarak yerel çalıştırıyorsanız ben kullanmanızı öneririz:

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

Birim testi kullanarak benim için çalışıyor.

Umarım yardım eder!


0

Şimdi benim için çalıştı, google hesabımın ayarını aşağıdaki gibi değiştirdim:

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

        }

Yine de aynı yazının bu bağlantısında programı çalıştırırken SSL ve TSL'yi etkinleştirdim . Çok zaman harcıyorum ama farkına vardım ve bu bağlantıyı buldum. Google'da 2 adım ve ayar kontrolü yapıldı. :

  • 2 adımlı doğrulamayı devre dışı bırakın (şifre ve OTP)

  • Daha az güvenli uygulamaya erişime izin verme (Daha az güvenli uygulamalara izin ver: AÇIK. )

Şimdi yukarıdaki programı kullanarak posta gönderebiliyorum.


3
Soru HTTPS ile ilgili.
Lorne Marquis

0

EJP'nin dediği gibi, https olmayan bir protokole yapılan çağrı nedeniyle gösterilen bir mesaj. HTTPS olduğundan eminseniz, baypas proxy ayarlarınızı kontrol edin ve web hizmeti ana bilgisayar URL'nizi baypas proxy listesine ekleyin.


0

bağlantı FTPS testi ise:

FTPSClient ftpClient = yeni FTPSClient (protokol, yanlış);

protokol = TLS, SSL ve false = isImplicit.



0

BURADA ÇOK ÖNEMLİ BİR CEVAP:

API URL Dizenizi (yönteminizde) https'den http'ye değiştirirsiniz. Bunun nedeni de olabilir:

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

onun yerine

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

-1

Aynı sorunu var ve sistem özelliklerinde "proxyUser" ve "proxyPassword" ayarlayarak çözüldü.

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

"proxyHost" ve "proxyPort" ile birlikte

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

Umarım işe yarar.


Apache HTTP istemcisini kullanıyorsanız ve bir yetkilendirme istisnanız varsa çalışır. Bu olacak değil OP belirttiği sorunu çözmek için çalışıyoruz.
Lorne Marquis

-1

25 numaralı bağlantı noktasını ve sonra pervaneyi kullanarak sorunumu çözdüm

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

-1

Koşuyorsan

  • Cisco AnyConnect Güvenli Mobilite Aracısı
  • Cisco AnyConnect Web Güvenlik Aracısı

hizmet (ler) i durdurmayı deneyin.

Bu cevap için neden aşağı oy kullandığımdan emin değilim. Kurumsal ağımızda bu, sorunun çözümü.


-1

Gmail smtp tarafından e-posta göndermek için deve-posta bileşeni kullanarak benzer bir hata var.

Çözüm, TLS bağlantı noktasından (587) SSL bağlantı noktasına (465) aşağıdaki gibi değişiyordu:

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

Hayır, çözüm düz metin bağlantı noktasına değişiyordu .
Lorne Marquis

-2

Java işlemini Java 6 veya önceki sürümlerde komut satırından çalıştırıyorsanız, bu anahtarı eklemek yukarıdaki sorunu benim için çözdü:

-Dhttps.protocols = "TLSv1"


-3

Belki varsayılan sertifikanızın süresi dolmuş olabilir. yönetici konsolu üzerinden yenilemek için "Güvenlik> SSL sertifikası ve anahtar yönetimi> Anahtar depoları ve sertifikalar> NodeDefaultKeyStore> Kişisel sertifikalar" bölümüne gidin ve "varsayılan" diğer adı seçin ve WAS'ı yeniden başlattıktan sonra "yenile" yi tıklayın.


1
Süresi dolmuş bir sertifika bu özel duruma neden olmaz.
Lorne Marquis

-3

Başka bir neden belki "erişim denenmiştir", belki URI'ye erişemezsiniz ve dahili ağ erişimi için engelleme yanıt sayfası alabilirsiniz. Uygulama bölgenizin güvenlik duvarı kuralına ihtiyacı olduğundan emin değilseniz, terminalden komut satırından bağlanmayı deneyin. GNU / Linux veya Unix için, bu komut gibi çalıştırmayı deneyebilir ve sonucun engelleme kuralından veya gerçekten uzak adresten geldiğini görebilirsiniz:echo | nc -v yazilimcity.net 443


Herhangi bir sayfa aldıysanız, SSL bölümü mükemmel bir şekilde çalışıyordu ve OP tarafından belirtilen istisnaya sahip olamazdınız.
Lorne Marquis

SSL kısmı herhangi bir sayfa almıyorum, özel hazırlanmış sayfa iç ağ HTTP yanıtı aldım. Bu senaryo için HTTP sayfasına HTTPS isteği üzerinden erişiyorum, bu nedenle bu istisnayı aldım. Ağ kuralı değiştikten sonra, bu kural dışı durum da kendi kendine çözümlenir.
oguzhankinik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.