首页 > 解决方案 > 在 GCP Compute Engine 上的 spring-boot 应用程序中获取“ssl3_get_record:wrong version number”

问题描述

我已经创建了一个带有 React 前端的 spring-boot 后端 java 应用程序,并且我正在尝试使用 GCP。

我让它在 AppEngine 上运行,并希望将应用程序的长时间运行版本放在 Compute Engine 中的虚拟机上,但是当我将它部署在计算引擎中的虚拟机上并尝试使用 HTTPS 连接到应用程序时,它给了我“ssl3_get_record :错误的版本号”。即使我尝试使用“localhost”连接到 vm 本身内部的应用程序也是如此。

这是一个使用嵌入式 tomcat 服务器的漂亮的 spring boot 应用程序。它包含一个用于 CORS 映射的 WebSecurityConfigureAdaptor 和一个 WebMvcConfigurer。

有没有人遇到过这个问题,或者可以给我一些关于我需要做些什么来解决它的指导?

编辑:

根据要求添加 curl -i -v https://localhost

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 3001 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (OUT), TLS alert, unknown CA (560):
* SSL certificate problem: self signed certificate
* Closing connection 0
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

标签: spring-bootsslgoogle-compute-engine

解决方案


ssl3_get_record:wrong version number意味着客户端无法打开与服务器的连接,因为它们可能不支持相同的 TLS 版本或设置。

SSLv3 很久以前就退役了。要么是旧的 Java 版本,要么他们从未更新过函数名。你用的是什么java版本?

日志表明应用程序可能在 HTTP/2 ( ALPN, offering h2) 和 TLSv1.3 上运行。根据我的经验,这些在老客户中肯定得不到很好的支持,就像 Java 企业通常使用的那样。考虑禁用 HTTP/2 或 TLS1.3,然后重试。

目前广泛使用和支持的 SSL 版本是 TLS 1.2。请参阅有关在 Java 应用程序中强制使用 TLS 版本的其他问题。由于 OpenJDK Java 11 获得 javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

该应用程序可能在自签名证书上运行。您可以从 let's encrypt 获取公共证书。


推荐阅读