繁体   English   中英

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

[英]Unrecognized SSL message, plaintext connection? Exception

我有一个 java 符合 package 与网络上的 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 服务器?

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

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

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

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

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

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

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

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

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

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

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

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

它适用于我使用单元测试。

希望有帮助!

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

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

        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 个以下步骤并在谷歌中设置控制。

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

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

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

如果连接是 FTPS 测试:

FTPSClient ftpClient = new FTPSClient(protocol, false);

协议 = TLS、SSL 和 false = isImplicit。

如果你正在跑步

  • Cisco AnyConnect 安全移动代理
  • Cisco AnyConnect Web 安全代理

尝试停止服务。

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

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

希望它会奏效。

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

为了使用 Gmail 我不得不打开“允许不太安全的应用程序”

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

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

如果您使用 Jetty 版本 9 或更早版本,您需要通过以下方式将其添加到 jetty

RUN java -jar ${JETTY_HOME}/start.jar --add-to-startd=https

并根据这个码头:How to use SSL in Jetty client side

从 Jetty 版本 10 开始,它应该可以开箱即用

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

-Dhttps.protocols="TLSv1"

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

您只需将您的 API URL 字符串(在您的方法中)从 https 更改为 Z80791B3AE7002FACB8888DZ 也可以是。

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

代替

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM