无法识别的 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&password=mypw&to=someemail@gmail.com&debugMode=true&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”。
NSInvalidArgumentException,使用 performSegueWithIdentifier 时发送到实例的无法识别的选择器