我有一个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 服务器吗?
我认为这是由于连接 与客户端机器建立的是 不安全。
这是因为您正在与 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 更改为 https 时,问题解决了。
将此添加为答案,因为它可能会对以后的某人有所帮助。
我不得不强制 jvm 使用 IPv4 堆栈来解决该错误。我的应用程序曾经在公司网络内工作,但从家里连接时却出现了同样的异常。不涉及代理。添加了 jvm 参数
-Djava.net.preferIPv4Stack=true
和所有 https
请求都表现正常。
如果您使用 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();
}
使用单元测试对我有用。
希望有帮助!
我在 Jdevelopr 11.1.1.7 IDE 中构建的 Java 应用程序中遇到了同样的问题。我通过取消选中代理表单项目属性的使用解决了该问题。
您可以在以下位置找到它: 项目属性 -> (从左侧面板)运行/调试/配置文件 -> 在右侧面板中单击(编辑) -> 从左侧面板中选择工具设置 -> 取消选中(使用代理)选项。
我使用端口 25 和 Follow prop 解决了我的问题
mailSender.javaMailProperties.putAll([
"mail.smtp.auth": "true",
"mail.smtp.starttls.enable": "false",
"mail.smtp.ssl.enable": "false",
"mail.smtp.socketFactory.fallback": "true",
]);
如果您使用 Jetty 版本 9 或更早版本,您需要将其添加到 jetty 通过
RUN java -jar ${JETTY_HOME}/start.jar --add-to-startd=https
并且根据这个 Jetty:如何在 Jetty 客户端使用 SSL
从 Jetty 版本 10 开始,它应该开箱即用
我在 Tomcat 中测试 Spring Boot API(在本地设置中)时偶然发现了这个问题。
在应用程序的
config.properties
文件(这是我们用来配置一些外部 URL 和端点的文件)中,其中一些是用 https
而不是 http
定义的(对于开发环境,我们正在模拟这些第三方 API通过 Postman / SOAPUI)。
通过将这些端点上的
https
更改为 http
并重新启动 Tomcat 解决了该问题。
如果连接是 FTPS 测试:
FTPSClient ftpClient = new FTPSClient(协议, false);
协议 = TLS,SSL 和 false = 是隐式的。
我在使用 Gmail 时遇到了这个异常。
为了使用 Gmail,我必须打开“允许安全性较低的应用程序”。
登录 Gmail 帐户后,可以在 https://www.google.com/settings/security/lesssecureapps 找到此 Gmail 设置。
我使用camel-mail组件通过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:[email protected]&password=mypw&[email protected]&debugMode=true&mail.smtp.starttls.enable=true"/>
</route>