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

时间:2011-06-30 08:49:41

标签: java https

我有一个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 个答案:

答案 0 :(得分:191)

  

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

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

答案 1 :(得分:16)

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

答案 2 :(得分:8)

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

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

我不得不强制jvm使用IPv4堆栈来解决错误。我的应用程序曾经在公司网络中工作,但在从家里连接时,它给出了相同的例外。没有代理人参与。添加了jvm参数    -Djava.net.preferIPv4Stack=true并且所有https次请求都表现正常。

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

正如EJP所说,由于呼叫非https协议,它显示的是一条消息。 如果您确定它是HTTPS,请检查您的旁路代理设置,以防万一将您的webservice主机URL添加到旁路代理列表

答案 7 :(得分:0)

如果连接是FTPS测试:

FTPSClient ftpClient = new FTPSClient(protocol,false);

protocol = TLS,SSL 和false = isImplicit。

答案 8 :(得分:0)

使用Gmail时我遇到了这个例外。

要使用Gmail,我必须开启"允许使用安全性较低的应用"

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

使用单元测试对我有用。

希望有帮助!

答案 11 :(得分: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");

答案 12 :(得分:-1)

它现在对我有用,我已经更改了我的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);

        }

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

  • 停用两步验证(密码和OTP)

  • 允许访问不太安全的应用(允许安全性较低的应用: ON。

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

答案 13 :(得分:-1)

如果您正在运行

  • Cisco AnyConnect安全移动代理
  • Cisco AnyConnect网络安全客户端

尝试停止服务。

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

答案 14 :(得分:-1)

我遇到了同样的问题,通过设置&#34; proxyUser&#34;解决了这个问题。和&#34; proxyPassword&#34;在系统属性中。

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

以及#34; proxyHost&#34;和&#34; proxyPort&#34;

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

希望它能奏效。

答案 15 :(得分:-1)

我使用端口25和关注prop

解决了我的问题
mailSender.javaMailProperties.putAll([
                "mail.smtp.auth": "true",
                "mail.smtp.starttls.enable": "false",
                "mail.smtp.ssl.enable": "false",
                "mail.smtp.socketFactory.fallback": "true",
        ]);

答案 16 :(得分:-2)

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

-Dhttps.protocols = “使用TLSv1”

答案 17 :(得分:-3)

也许您的默认cerficate已过期。通过管理控制台更新它“安全&gt; SSL证书和密钥管理&gt;密钥存储和证书&gt; NodeDefaultKeyStore&gt;个人证书”选择“默认”别名,然后点击“续订”,然后重新启动WAS。

答案 18 :(得分:-3)

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