无法识别的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服务器?

Answers:


238

我认为这是由于与客户端计算机建立的连接不安全。

这是由于您正在与HTTP服务器而不是HTTPS服务器进行通信。可能您没有为HTTPS使用正确的端口号。


7
我有同样的错误,当我开始使用http而不是https时,我解决了。但是,当我将链接放在带有https的浏览器中时,它将起作用!而且我需要执行一个安全的查询。关于如何解决该问题的任何想法吗?
ccoutinho 2014年

9
@rsy当您将链接...与https放置在一起时,浏览器将为您更改为端口443。您也可以自己做。HttpURLConnection如果您根本不指定端口,的确会自动为您完成。
2014年

我假设您可以将服务器上的任何端口设置为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 2014年

1
@surfealokesea问题与HTTP和HTTPS有关,与SMTP的答案或个人经验无关。
罗恩侯爵

1
是的,但这不仅对他而言,对于具有相同“无法识别的ssl消息”的其他用户也是如此。+1给您,Thobith
sam1370 '18

9

当我通过代理执行POST请求之前,忘记登录公司防火墙时,会收到相同的错误消息。


尽管我在公司内部,但我也必须这样做!
单线程

1
您能简要解释一下如何解决吗,我现在在公司中也面临着同样的问题
Nitesh

3

我遇到了同样的错误。这是因为我正在使用http访问https端口。当我将http更改为https时,此问题已解决。


11
否,通过HTTPS访问HTTP端口时出现错误。阅读错误消息。您已连接到纯文本目标。您描述的情况不会导致SSLException,因为您不会一直在使用SSL。
罗恩侯爵

1

我在Jdevelopr 11.1.1.7 IDE中构建的Java应用程序中遇到了同样的问题。我通过取消选中代理表单项目属性的使用来解决此问题。

您可以在以下位置找到它:项目属性->(从左窗格中)运行/调试/配置文件->单击(编辑)在右面板中->从左面板中设置工具->取消选中(使用代理)选项。


1

将其添加为答案,因为它稍后可能会对某人有所帮助。

我不得不强迫jvm使用IPv4堆栈来解决该错误。我的应用程序过去曾在公司网络内工作,但在家连接时却出现了同样的异常。不涉及代理。添加了jvm参数 -Djava.net.preferIPv4Stack=true,所有https请求均正常运行。


1

如果您使用Spring在本地运行,建议使用:

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

  • 启用允许访问安全性较低的应用程序(允许安全性较低的应用程序:ON。

现在,我可以使用上述程序发送邮件了。


3
问题是关于HTTPS。
罗恩侯爵,


0

如果连接是FTPS测试:

FTPSClient ftpClient =新的FTPSClient(协议,false);

协议= TLS,SSL和false = isImplicit。



0

这是一个非常重要的答案:

您只需将API URL字符串(在您的方法中)从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规定的问题。
罗恩侯爵

-1

我使用端口25和following prop解决了我的问题

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

-1

如果您正在跑步

  • 思科AnyConnect安全移动代理
  • 思科AnyConnect Web安全代理

尝试停止服务。

不知道为什么我对此答案投了反对票。在我们的公司网络中,这就是解决问题的方法。


-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 6或更早版本的命令行运行Java进程,则添加此开关可以为我解决上述问题:

-Dhttps.protocols =“ TLSv1”


-3

也许您的默认证书已过期。要通过管理控制台进行续订,请转到“安全性> SSL证书和密钥管理>密钥存储和证书> NodeDefaultKeyStore>个人证书”,选择“默认”别名,然后单击“续订”,然后重新启动WAS。


1
过期的证书清除不会导致此异常。
罗恩侯爵

-3

另一个原因可能是“拒绝访问”,也许您无法访问URI并收到内部网络访问的阻止响应页面。如果不确定您的应用程序区域是否需要防火墙规则,请尝试从终端,命令行进行连接。对于GNU / Linux或Unix,您可以尝试像以下命令一样运行,并查看结果来自阻止规则或真正的远程地址:echo | nc -v yazilimcity.net 443


如果您收到任何类型的页面,则SSL部分运行正常,并且您不会收到OP引用的异常。
罗恩侯爵

我没有收到任何类型的SSL部分页面,而是收到了内部网络HTTP响应即特殊准备的页面。对于这种情况,我正在通过HTTPS请求访问HTTP页面,因此我收到了此异常。网络规则更改后,此异常也会自行解决。
oguzhankinik '18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.