ข้อความ SSL ที่ไม่รู้จักการเชื่อมต่อแบบธรรมดา? ข้อยกเว้น


172

ฉันมีแพคเกจที่รองรับจาวาเพื่อพูดคุยกับเซิร์ฟเวอร์ 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จะทำเพื่อคุณโดยอัตโนมัติหากคุณไม่ได้ระบุพอร์ตเลย
มาร์ควิสแห่ง Lorne

ฉันคิดว่าคุณสามารถตั้งค่าพอร์ตใด ๆ บนเซิร์ฟเวอร์ของคุณให้เป็น HTTPS มันไม่จำเป็นต้องเป็นพอร์ตเฉพาะหรือไม่

1
@KarlSherwin สามารถเป็นพอร์ตใดก็ได้ที่คุณต้องการภายใต้การจอง แต่ถ้าไม่ใช่ 443 คุณจะต้องซื้อรถเข็นรอบตัวคุณใน URL ทั้งหมดของคุณ
มาร์ควิสแห่ง Lorne

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 ไม่เกี่ยวข้อง
มาร์ควิสแห่ง Lorne

1
ใช่ แต่สิ่งนี้ไม่ได้มีไว้สำหรับเขาเท่านั้นสำหรับผู้ใช้รายอื่นที่มีข้อความ 'ssl ที่ไม่รู้จัก' นี้เหมือนกัน +1 ถึงคุณ Thobith
sam1370

9

ฉันได้รับข้อความแสดงข้อผิดพลาดเดียวกันเมื่อฉันลืมลงชื่อเข้าใช้ไฟร์วอลล์ของ บริษัท ก่อนดำเนินการคำขอ POST ผ่านทางพร็อกซี


ฉันต้องทำแบบเดียวกันแม้ว่าฉันจะอยู่ใน บริษัท !
MonoThreaded

1
คุณช่วยอธิบายสั้น ๆ เกี่ยวกับวิธีการแก้ปัญหาได้ไหมฉัน
Nitesh

3

ฉันได้รับข้อผิดพลาดเดียวกัน เป็นเพราะฉันกำลังเข้าถึงพอร์ต https โดยใช้ http .. ปัญหาได้รับการแก้ไขเมื่อฉันเปลี่ยน http เป็น https


11
ไม่คุณได้รับข้อผิดพลาดเมื่อเข้าถึงพอร์ต HTTP ผ่าน HTTPS อ่านข้อความแสดงข้อผิดพลาด คุณเชื่อมต่อกับเป้าหมายธรรมดา สถานการณ์ที่คุณอธิบายจะไม่ทำให้ SSLException เกิดขึ้นเนื่องจากคุณไม่ได้ใช้ SSL
มาร์ควิสแห่ง Lorne

1

ฉันประสบปัญหาเดียวกันจากโปรแกรม Java ที่สร้างขึ้นใน Jdevelopr 11.1.1.7 IDE ฉันแก้ไขปัญหาโดยการยกเลิกการเลือกการใช้คุณสมบัติพร็อกซีของโครงการ

คุณสามารถค้นหาได้ในรายการต่อไปนี้: คุณสมบัติโครงการ -> (จากแผงด้านซ้าย) เรียกใช้ / ดีบัก / โปรไฟล์ -> คลิก (แก้ไข) จากแผงด้านขวา -> การตั้งค่าเครื่องมือจากแผงด้านซ้าย -> ตัวเลือกยกเลิกการใช้


1

การเพิ่มคำตอบนี้เป็นคำตอบที่อาจช่วยใครได้ในภายหลัง

ฉันต้องบังคับ jvm ให้ใช้ IPv4 stack เพื่อแก้ไขข้อผิดพลาด แอปพลิเคชันของฉันเคยทำงานภายในเครือข่ายของ บริษัท แต่ในขณะที่เชื่อมต่อจากที่บ้านมันก็ให้ข้อยกเว้นเดียวกัน ไม่มีพร็อกซีที่เกี่ยวข้อง เพิ่มอาร์กิวเมนต์ 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 ในขณะที่รันโปรแกรมในลิงค์นี้ของโพสต์เดียวกัน ฉันใช้เวลามาก แต่กว่าที่ฉันรู้และพบลิงค์นี้ และทำตาม 2 ขั้นตอนและตั้งค่าการควบคุมใน google :

  • ปิดใช้งานการยืนยันแบบสองขั้นตอน (รหัสผ่านและ OTP)

  • การเปิดใช้งานเพื่ออนุญาตให้เข้าถึงแอปที่มีความปลอดภัยน้อยกว่า ( อนุญาตแอปที่ปลอดภัยน้อยกว่า: เปิด )

ตอนนี้ฉันสามารถส่งจดหมายโดยใช้โปรแกรมด้านบน


3
คำถามเกี่ยวกับ HTTPS
มาร์ควิสแห่ง Lorne

0

ดังที่ EJP กล่าวว่าเป็นข้อความที่แสดงเนื่องจากมีการโทรไปยังโปรโตคอลที่ไม่ใช่ https หากคุณแน่ใจว่าเป็น HTTPS ให้ตรวจสอบการตั้งค่าพร็อกซีบายพาสของคุณและในกรณีที่เพิ่ม URL โฮสต์เว็บเซอร์ของคุณไปยังรายการพร็อกซีบายพาส


0

ถ้าการเชื่อมต่อเป็นการทดสอบ FTPS:

FTPSClient ftpClient = FTPSClient ใหม่ (โปรโตคอล, เท็จ);

โปรโตคอล = 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);

หวังว่ามันจะทำงาน


มันจะทำงานถ้าคุณใช้ Apache HTTP ไคลเอ็นต์และคุณได้รับข้อยกเว้นการอนุญาต มันจะไม่ทำงานเพื่อแก้ไขปัญหาที่ระบุโดย OP
มาร์ควิสแห่ง Lorne

-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

ลองหยุดบริการ

ไม่แน่ใจว่าทำไมฉันถึงได้ลงคะแนนสำหรับคำตอบนี้ ในเครือข่ายองค์กรของเรานี่คือทางออกของปัญหา


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

ไม่โซลูชันเปลี่ยนเป็นพอร์ตธรรมดา
มาร์ควิสแห่ง Lorne

-2

หากคุณกำลังเรียกใช้กระบวนการ Java จากบรรทัดคำสั่งบน Java 6 หรือก่อนหน้าการเพิ่มสวิตช์นี้ช่วยแก้ไขปัญหาด้านบนสำหรับฉัน:

-Dhttps.protocols = "TLSv1"


-3

บางที cerficate ที่เป็นค่าเริ่มต้นของคุณหมดอายุแล้ว หากต้องการต่ออายุผ่านคอนโซลผู้ดูแลระบบให้ไปที่ "ความปลอดภัย> ใบรับรอง SSL และการจัดการคีย์> ที่เก็บคีย์และใบรับรอง> NodeDefaultKeyStore> ใบรับรองส่วนบุคคล" เลือกนามแฝง "เริ่มต้น" และคลิกที่ "ต่ออายุ" หลังจากรีสตาร์ท WAS


1
ใบรับรองที่หมดอายุไม่ทำให้เกิดข้อยกเว้นนี้
มาร์ควิสแห่ง Lorne

-3

อีกเหตุผลหนึ่งก็คือ "ปฏิเสธการเข้าถึง" บางทีคุณอาจไม่สามารถเข้าถึง URI และได้รับหน้าการตอบสนองการบล็อกสำหรับการเข้าถึงเครือข่ายภายใน หากคุณไม่แน่ใจว่าโซนแอปพลิเคชันของคุณต้องการกฎไฟร์วอลล์คุณพยายามเชื่อมต่อจากเทอร์มินัลบรรทัดคำสั่ง สำหรับ GNU / Linux หรือ Unix คุณสามารถลองใช้คำสั่งนี้และดูว่าผลลัพธ์มาจากการบล็อกกฎหรือที่อยู่ระยะไกลจริงๆ:echo | nc -v yazilimcity.net 443


หากคุณได้รับหน้าชนิดใดส่วนหนึ่งของ SSL ทำงานได้อย่างสมบูรณ์แบบและคุณจะไม่ได้รับการยกเว้นจาก OP
มาร์ควิสแห่ง Lorne

ฉันไม่ได้รับส่วน SSL ของหน้าใด ๆ ฉันได้รับการตอบกลับ HTTP ของเครือข่ายภายในที่เตรียมไว้เป็นพิเศษ สำหรับสถานการณ์นี้ฉันกำลังเข้าถึงหน้า HTTP ผ่านทางคำขอ HTTPS ดังนั้นฉันจึงได้รับข้อยกเว้นนี้ หลังจากกฎของเครือข่ายเปลี่ยนแปลงข้อยกเว้นนี้จะแก้ไขด้วยตนเอง
oguzhankinik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.