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

IT小君   2021-09-15T07:59:26

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

点击广告,支持我们为你提供更好的服务
评论(19)
IT小君

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

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

2021-09-15T07:59:26   回复
IT小君
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
2021-09-15T07:59:26   回复
IT小君

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

2021-09-15T07:59:26   回复
IT小君

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

2021-09-15T07:59:26   回复
IT小君

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

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

2021-09-15T07:59:27   回复
IT小君

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

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

2021-09-15T07:59:27   回复
IT小君

我使用端口 25 和以下道具解决了我的问题

mailSender.javaMailProperties.putAll([
                "mail.smtp.auth": "true",
                "mail.smtp.starttls.enable": "false",
                "mail.smtp.ssl.enable": "false",
                "mail.smtp.socketFactory.fallback": "true",
        ]);
2021-09-15T07:59:27   回复
IT小君

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

它使用单元测试对我有用。

希望有帮助!

2021-09-15T07:59:27   回复
IT小君

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

        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个步骤和设置控制。

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

  • 启用允许访问不太安全的应用程序(允许不太安全的应用程序:开。

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

2021-09-15T07:59:28   回复
IT小君

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

2021-09-15T07:59:28   回复
IT小君

如果连接是 FTPS 测试:

FTPSClient ftpClient = 新的 FTPSClient(protocol, false);

协议 = TLS、SSL 和 false = isImplicit。

2021-09-15T07:59:28   回复
IT小君

我遇到了同样的问题,它通过在系统属性中设置“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);

希望它会起作用。

2021-09-15T07:59:28   回复
IT小君

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

为了使用 Gmail,我必须打开“允许安全性较低的应用程序”

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

2021-09-15T07:59:28   回复
IT小君

如果你正在跑步

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

尝试停止服务。

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

2021-09-15T07:59:29   回复
IT小君

我使用骆驼邮件组件通过 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>
2021-09-15T07:59:30   回复
IT小君

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

-Dhttps.protocols="TLSv1"

2021-09-15T07:59:30   回复
IT小君

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

您只需将 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");
2021-09-15T07:59:30   回复
IT小君

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

2021-09-15T07:59:30   回复
IT小君

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

2021-09-15T07:59:30   回复