无法识别的 SSL 消息,明文连接?例外

Posted

技术标签:

【中文标题】无法识别的 SSL 消息,明文连接?例外【英文标题】:Unrecognized SSL message, plaintext connection? Exception 【发布时间】:2011-09-25 19:30:00 【问题描述】:

我有一个 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 服务器?

【问题讨论】:

为了 Google 搜索,这最近被返回为“无法识别的记录版本 TLS-0.0,明文连接?” 【参考方案1】:

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

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

【讨论】:

我有同样的错误,当我开始使用http而不是https时我解决了。但是,当我使用 https 将链接放在浏览器中时,它可以工作!我需要执行一个安全的查询。关于如何解决问题的任何想法? @rsy 当您使用 https 放置链接时,浏览器将更改为您的端口 443。你也可以自己做。如果您根本不指定端口,HttpURLConnection 确实会自动为您完成。 我假设您可以将服务器上的任何端口设置为 HTTPS,它不必是特定端口? @KarlSherwin 可以是您喜欢的任何端口,但需保留,但如果不是 443,您将不得不在您的所有 URL 中自行购买。 非常感谢。实际上,我使用端口 80 进行 HTTPS 连接。当我将其更改为 443 时,它按预期工作。【参考方案2】:
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

【讨论】:

他说的是 HTTPS,而不是 SMTP。 -1 在我的情况下有效,谢谢! javax.mail.MessagingException:无法连接到 SMTP 主机:mail.livemusicgo.com,端口:25;嵌套异常是:javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? @surfealokesea 这个问题是关于 HTTP 和 HTTPS 的,与 SMTP 的答案或个人经验无关。 是的,但这不仅适用于他,也适用于其他拥有相同“无法识别的 ssl 消息”的用户。 +1 给你,Thobith【参考方案3】:

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

【讨论】:

虽然我在公司,但我也必须这样做! 能否请您简要解释一下如何解决,我公司现在也面临同样的问题【参考方案4】:

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

【讨论】:

否,您在通过 HTTPS 访问 HTTP 端口时遇到错误。阅读错误信息。您连接到纯文本目标。您描述的情况不会导致 SSLException,因为您不会一直使用 SSL。【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

我使用端口 25 和以下属性解决了我的问题

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

【讨论】:

【参考方案8】:

如果您使用 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();

使用单元测试对我有用。

希望对你有帮助!

【讨论】:

【参考方案9】:

它现在对我有用,我已经将我的谷歌帐户的设置更改如下:

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

        

虽然我在同一帖子的link 中运行程序时启用了 SSL 和 TSL。我花了很多时间,但我意识到并找到了这个链接。 并完成了 2 个以下步骤并在谷歌中设置控制。 :

禁用两步验证(密码和一次性密码)

启用以允许访问安全性较低的应用程序(允许安全性较低的应用程序: 开。)

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

【讨论】:

问题是关于 HTTPS。【参考方案10】:

正如 EJP 所说,这是由于调用非 https 协议而显示的消息。 如果您确定是 HTTPS,请检查您的绕过代理设置,以防万一将您的 Web 服务主机 url 添加到绕过代理列表中

【讨论】:

【参考方案11】:

如果连接是 FTPS 测试:

FTPSClient ftpClient = new FTPSClient(protocol, false);

协议 = TLS、SSL 和 false = isImplicit。

【讨论】:

【参考方案12】:

我遇到了同样的问题,通过在系统属性中设置“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 所述的问题。【参考方案13】:

我在使用 Gmail 时遇到了这个异常。

为了使用 Gmail,我必须开启“允许不太安全的应用”

登录 gmail 帐户后,可以在 https://www.google.com/settings/security/lesssecureapps 找到此 Gmail 设置。

【讨论】:

【参考方案14】:

如果你正在跑步

Cisco AnyConnect 安全移动代理 思科 AnyConnect 网络安全代理

尝试停止服务。

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

【讨论】:

【参考方案15】:

我在使用骆驼邮件组件通过 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>

【讨论】:

不,解决方案正在更改为 plaintext 端口。【参考方案16】:

如果您在 Java 6 或更早版本上从命令行运行 Java 进程,添加此开关为我解决了上述问题:

-Dhttps.protocols="TLSv1"

【讨论】:

【参考方案17】:

这里有一个非常重要的答案:

您只需将 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");

【讨论】:

【参考方案18】:

您的默认证书可能已过期。要通过管理控制台更新它,请转到“安全 > SSL 证书和密钥管理 > 密钥库和证书 > NodeDefaultKeyStore > 个人证书”选择“默认”别名并单击“更新”,然后重新启动 WAS。

【讨论】:

过期的证书不会导致此异常。【参考方案19】:

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

【讨论】:

如果您收到任何类型的页面,则 SSL 部分工作正常,您不会遇到 OP 引用的异常。 我没有收到任何类型的 SSL 页面,我收到了专门准备页面的内部网络 HTTP 响应。对于这种情况,我通过 HTTPS 请求访问 HTTP 页面,所以我收到了这个异常。网络规则改变后,这个异常也会自行解决。

以上是关于无法识别的 SSL 消息,明文连接?例外的主要内容,如果未能解决你的问题,请参考以下文章

spotify/dockerfile-maven 插件:无法构建映像:javax.net.ssl.SSLException:无法识别的 SSL 消息,纯文本连接

分析器错误消息: 无法识别的属性“targetFramework”。

虚拟机网卡显示未识别的网络,求解决!?

用ACCESS数据库提示 无法识别的数据库格式

NSInvalidArgumentException,使用 performSegueWithIdentifier 时发送到实例的无法识别的选择器

为什么CY7C68013A是usb无法识别