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

Posted

技术标签:

【中文标题】Java -> Flask Https 请求:javax.net.ssl.SSLHandshakeException:PKIX 路径构建失败【英文标题】:Java -> Flask Https Request: javax.net.ssl.SSLHandshakeException: PKIX path building failed 【发布时间】:2021-05-08 12:57:24 【问题描述】:

所以我正在尝试向我的 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:无法找到到所请求目标的有效证书路径

【问题讨论】:

也许您将方案更改为https,但保留了http 端口 【参考方案1】:

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

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

但是……

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

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

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

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

【讨论】:

以上是关于Java -> Flask Https 请求:javax.net.ssl.SSLHandshakeException:PKIX 路径构建失败的主要内容,如果未能解决你的问题,请参考以下文章

flask 请求上下文源码(转)

如何使用客户端上的“requests”模块和服务器上的“flask-restful”验证 https 请求的自签名证书(TLS1.2)

Flask获取请求参数

Flask-RESTful 请求解释

Flask中的请求上下文和应用上下文

flask 源码浅析(flask 如何处理请求(多线程,多进程,IO多路复用))