Java -> Flask Https 请求:javax.net.ssl.SSLHandshakeException:PKIX 路径构建失败

问题描述

所以我正在尝试向我的 Flask 应用程序发送一个 HTTPS 请求。之前,它仅使用 HTTP 就可以成功运行。现在,我想将其更改为 HTTPS。

但不幸的是它不起作用。在我的 Java IDE 和 Python IDE 中,我收到以下错误

javax.net.ssl.SSLException:不支持或无法识别的 SSL 消息(Java 客户端)

代码 400,消息错误请求版本 ("\x1bè\x13\x16)..."‚ ~ˆòÎ×ý›tYê >ôeïõ?2ŸÏËðÚü$ü^d ‰ô$NªO5~EN4ë=Y8õûb~ïÁ¢˜è) bÀ,À+Ì©À0̨À/ ŸÌª £ ž $À(À#À' kjg @À.À2À-À1À&ÀÀ%À)À" HTTPStatus.BAD_REQUEST* (Flask 服务器端)

我发送请求的代码是:

URL myURL = new URL(requestUrl);
HttpsURLConnection connection = (HttpsURLConnection) myURL.openConnection();
connection.setRequestMethod("GET");
System.out.println(connection.getResponseCode());
...

基本上,我只是将连接对象更改为 Https,并将 URL 字符串修改为使用“https”。它与 HTTP 完美配合,现在,HTTPS 无效。

我需要做什么才能让它与 HTTPS 一起工作?


编辑:在我的 Flask 应用程序中,我将 app.run 更改为还包含参数 ssl_context='adhoc'。现在我得到了一个不同的例外:

javax.net.ssl.SSLHandshakeException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效认证路径

解决方法

ssl_context='adhoc' 是正确的方法。

这会生成一个自定义 SSL 证书,您可以通过 https 访问您的 Flask 应用程序。

但是……

由于此证书是自签名证书,您的客户端(浏览器、curl 或 Java 应用程序)不信任该证书。

这就是您收到错误消息的原因。

查看以下博客文章,了解您可以采取的更多措施:

https://blog.miguelgrinberg.com/post/running-your-flask-application-over-https