Tin nhắn SSL không được nhận dạng, kết nối văn bản gốc? ngoại lệ


171

Tôi có một gói tuân thủ java để nói chuyện với máy chủ https trên mạng. Chạy trình biên dịch cho ngoại lệ sau:

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)

Tôi nghĩ rằng điều này là do kết nối được thiết lập với máy khách không an toàn. Có cách nào để định cấu hình máy hoặc cổng cục bộ để kết nối với máy chủ https từ xa không?

Câu trả lời:


237

Tôi nghĩ rằng điều này là do kết nối được thiết lập với máy khách không an toàn.

Điều này là do thực tế là bạn đang nói chuyện với máy chủ HTTP chứ không phải máy chủ HTTPS. Có lẽ bạn đã không sử dụng đúng số cổng cho HTTPS.


7
Tôi có cùng một lỗi và tôi đã giải quyết khi tôi bắt đầu sử dụng http thay vì https. Nhưng khi tôi đặt liên kết trong trình duyệt với https thì nó hoạt động! Và tôi cần phải thực hiện một truy vấn an toàn. Bất kỳ ý tưởng về làm thế nào tôi có thể giải quyết vấn đề?
ccoutinho

9
@rsy Khi bạn 'đặt liên kết ... với https', trình duyệt sẽ đổi thành cổng 443 cho bạn. Bạn có thể làm như vậy chính mình. Quả thực HttpURLConnectionsẽ tự động làm điều đó cho bạn, nếu bạn không chỉ định một cổng nào cả.
Hầu tước Lorne

Tôi giả sử rằng bạn có thể thiết lập bất kỳ cổng nào trên máy chủ của mình thành HTTPS, đó không phải là một cổng cụ thể?

1
@KarlSherwin Nó có thể là bất kỳ cổng nào bạn thích, tùy thuộc vào đặt chỗ, nhưng nếu không phải là 443, bạn sẽ phải đặt giỏ hàng đó quanh mình trong tất cả các URL của mình.
Hầu tước Lorne

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

Bạn nên có một tên miền SMTP cục bộ sẽ liên lạc với máy chủ thư và thiết lập kết nối mới, bạn cũng nên thay đổi thuộc tính SSL trong chương trình của mình bên dưới

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

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

10
Anh ấy đang nói HTTPS, không phải là SMTP. -1
Hầu tước Lorne

2
Trong trường hợp của tôi mà làm việc, cảm ơn! javax.mail.MessagingException: Không thể kết nối với máy chủ SMTP: mail.livemusicgo.com, port: 25; ngoại lệ lồng nhau là: javax.net.ssl.SSLException: Tin nhắn SSL không được nhận dạng, kết nối văn bản gốc?
Surfealokesea

1
@surfealokesea Câu hỏi là về HTTP và HTTPS, và câu trả lời hoặc trải nghiệm cá nhân về SMTP không liên quan.
Hầu tước Lorne

1
Có nhưng đây không chỉ dành cho anh ấy mà nó còn dành cho những người dùng khác đang có 'thông điệp ssl không nhận dạng' này. +1 cho bạn, Thobith
sam1370

9

Tôi đã nhận được thông báo lỗi tương tự khi tôi quên đăng nhập vào tường lửa của công ty, trước khi thực hiện yêu cầu POST thông qua proxy.


Tôi đã phải làm như vậy mặc dù tôi đã ở trong công ty!
MonoThreaded

1
bạn có thể vui lòng giải thích ngắn gọn cách giải quyết không, tôi cũng đang đối mặt với vấn đề tương tự trong công ty của mình phải không
Nitesh

3

Tôi đã nhận được cùng một lỗi. đó là vì tôi đã truy cập cổng https bằng http .. Vấn đề được giải quyết khi tôi thay đổi http thành https.


11
Không, bạn đã gặp lỗi khi truy cập cổng HTTP qua HTTPS. Đọc thông báo lỗi. Bạn đã kết nối với một mục tiêu rõ ràng. Tình huống bạn mô tả sẽ không gây ra SSLException, vì bạn sẽ không sử dụng SSL.
Hầu tước Lorne

1

Tôi gặp vấn đề tương tự từ ứng dụng Java được xây dựng trong IDE Jdevelopr 11.1.1.7. Tôi đã giải quyết vấn đề bằng cách bỏ chọn việc sử dụng thuộc tính Project form proxy.

Bạn có thể tìm thấy nó trong các mục sau: Thuộc tính dự án -> (từ panle trái) Chạy / Gỡ lỗi / Hồ sơ -> Nhấp (chỉnh sửa) từ bảng bên phải -> Cài đặt công cụ từ bảng điều khiển bên trái -> bỏ chọn (Sử dụng Proxy).


1

Thêm điều này như một câu trả lời vì nó có thể giúp ai đó sau này.

Tôi đã buộc jvm sử dụng ngăn xếp IPv4 để khắc phục lỗi. Ứng dụng của tôi đã từng hoạt động trong mạng công ty, nhưng trong khi kết nối từ nhà thì nó cũng cho ngoại lệ tương tự. Không có proxy liên quan. Đã thêm đối số jvm -Djava.net.preferIPv4Stack=truevà tất cả các httpsyêu cầu đều hoạt động bình thường.


1

Nếu bạn đang chạy cục bộ bằng mùa xuân, tôi khuyên bạn nên sử dụng:

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

Nó hoạt động cho tôi bằng cách sử dụng thử nghiệm đơn vị.

Hy vọng nó sẽ giúp!


0

Nó hoạt động với tôi bây giờ, tôi đã thay đổi cài đặt tài khoản google của mình như sau:

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

        }

Mặc dù tôi đã kích hoạt SSL và TSL trong khi chạy chương trình trong liên kết này của cùng một bài. Tôi dành rất nhiều thời gian nhưng hơn tôi nhận ra và tìm thấy liên kết này. Và thực hiện 2 bước sau và thiết lập điều khiển trong google. :

  • Vô hiệu hóa xác minh 2 bước (mật khẩu và OTP)

  • Kích hoạt để cho phép truy cập ứng dụng kém an toàn hơn ( Cho phép ứng dụng kém an toàn hơn: BẬT. )

Bây giờ tôi có thể gửi thư bằng chương trình trên.


3
Câu hỏi là về HTTPS.
Hầu tước Lorne

0

Như EJP đã nói, đó là một thông báo được hiển thị do cuộc gọi đến giao thức không https. Nếu bạn chắc chắn đó là HTTPS, hãy kiểm tra cài đặt proxy bỏ qua của bạn và trong trường hợp thêm url máy chủ dịch vụ web của bạn vào danh sách proxy bỏ qua


0

nếu kết nối là thử nghiệm FTPS:

FTPSClient ftpClient = new FTPSClient (giao thức, sai);

giao thức = TLS, SSL và false = isImplicit.



0

ĐÂY LÀ MỘT TRẢ LỜI RẤT QUAN TRỌNG:

Bạn chỉ cần thay đổi Chuỗi URL API (theo phương pháp của bạn) từ https thành http .. Đây cũng có thể là nguyên nhân:

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

thay vì

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

-1

Tôi gặp vấn đề tương tự và nó đã được giải quyết bằng cách đặt "proxyUser" và "proxyPassword" trong thuộc tính hệ thống.

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

cùng với "proxyhost" và "proxyPort"

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

Hy vọng nó sẽ làm việc.


Nó sẽ hoạt động nếu bạn đang sử dụng máy khách HTTP Apache và bạn có một ngoại lệ ủy quyền. Nó sẽ không hoạt động để giải quyết vấn đề được OP nêu.
Hầu tước Lorne

-1

tôi đã giải quyết vấn đề của mình bằng cổng 25 và theo prop

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

-1

Trong trường hợp bạn đang chạy

  • Đại lý di động an toàn Cisco AnyConnect
  • Đại lý bảo mật web Cisco AnyConnect

thử dừng dịch vụ.

Không chắc chắn tại sao tôi nhận được một phiếu bầu cho câu trả lời này. Trong mạng công ty của chúng tôi, đây là giải pháp cho vấn đề này.


-1

Tôi đã gặp lỗi tương tự khi sử dụng thành phần mail lạc đà để gửi e-mail bằng gmail smtp.

Giải pháp đã thay đổi từ cổng TLS (587) sang cổng SSL (465) như sau:

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

Không, giải pháp đã được thay đổi thành một cổng văn bản .
Hầu tước Lorne

-2

Nếu bạn đang chạy quy trình Java từ dòng lệnh trên Java 6 trở về trước, việc thêm công tắc này đã giải quyết vấn đề ở trên cho tôi:

-Dhttps.prot Protocol = "TLSv1"


-3

Có thể cerficate mặc định của bạn đã hết hạn. để gia hạn thông qua bảng điều khiển quản trị, hãy truy cập "Bảo mật> Chứng chỉ SSL và quản lý khóa> Cửa hàng và chứng chỉ chính> NodeDefaultKeyStore> Chứng chỉ cá nhân" chọn bí danh "mặc định" và nhấp vào "gia hạn" sau đó khởi động lại WAS.


1
Giấy chứng nhận hết hạn không gây ra ngoại lệ này.
Hầu tước Lorne

-3

Một lý do khác có thể là "truy cập bị từ chối", có thể bạn không thể truy cập vào URI và nhận được trang phản hồi chặn để truy cập mạng nội bộ. Nếu bạn không chắc chắn khu vực ứng dụng của bạn cần quy tắc tường lửa, bạn hãy thử kết nối từ thiết bị đầu cuối, dòng lệnh. Đối với GNU / Linux hoặc Unix, bạn có thể thử chạy như lệnh này và xem kết quả đến từ quy tắc chặn hoặc địa chỉ thực sự từ xa:echo | nc -v yazilimcity.net 443


Nếu bạn nhận được bất kỳ loại trang nào, phần SSL hoạt động hoàn hảo và bạn sẽ không có ngoại lệ được trích dẫn bởi OP.
Hầu tước Lorne

Tôi không nhận được bất kỳ loại trang nào trong phần SSL, tôi đã nhận được phản hồi HTTP của mạng nội bộ trang được chuẩn bị đặc biệt đó. Đối với kịch bản này, tôi đang truy cập vào trang HTTP thông qua yêu cầu HTTPS vì vậy tôi đã nhận được ngoại lệ này. Sau khi thay đổi quy tắc mạng, ngoại lệ này cũng tự giải quyết.
oguzhankinik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.