【问题标题】:Heroku: Spring Boot Gradle app with https tomcat server and certificate pinningHeroku:带有 https Tomcat 服务器和证书固定的 Spring Boot Gradle 应用程序
【发布时间】:2016-03-17 20:35:19
【问题描述】:

我有一个 Spring Boot java 应用程序,它使用自签名证书与 android 前端进行通信。

我使用 tomcat 服务器作为应用程序的容器:

compile 'org.springframework.boot:spring-boot-starter-tomcat'

现在,我启用了 https / ssl:

            TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
            tomcat.addConnectorCustomizers(connector -> {
                connector.setPort(Integer.parseInt(serverPort));
                connector.setSecure(true);
                connector.setScheme("https");

我必须启用 SSL,因为我希望我的 android 前端能够安全地与我的服务器通信。我使用称为证书固定的技术,这意味着我将相同的自签名证书添加到我的服务器和我的 android 应用程序。对于两者之间的任何 http 通信,通信将使用 same 证书的密钥进行加密,因此服务器和 android 应用程序将能够相互理解。

当我将它加载到 Heroku 时,每次尝试调用服务器时都会出错:

2015-12-11T20:04:32.424629+00:00 heroku[router]: at=error code=H13 desc="Connection closed without response" method=GET path="/getfood?postid=566348364a918a12046ce96f" host=app.herokuapp.com request_id=bf975c13-69f3-45f5-9e04-ca6817b6c410 fwd="197.89.172.181" dyno=web.1 connect=0ms service=4ms status=503 bytes=0

根据 Julie 的这篇博客:http://juliekrueger.com/blog/

附带说明,Heroku 应用程序默认启用 https。我的服务器 正在安装已将 Tomcat 配置为使用 https,并尝试 访问端点返回代码=H13 desc="连接关闭 没有响应”错误。在我删除该配置后,错误 走了。

我可以通过从我的 tomcat 服务器中删除 ssl / https 来修复错误,但正如我所提到的,我想使用证书固定技术进行安全通信。

我在考虑是否可以禁用 heroku 端的 SSL,但保持我的 tomcat 服务器 SSL 处于活动状态,但我已经联系了 Heroku,他们告诉我禁用他们服务标准的搭载 SSL 是不可能的。

我还查看了此处称为 SSL 端点的付费替代方案,但它似乎只对自定义域有用。由于所有端点都在我的 android 应用程序中编码并且对用户不可见,因此使用自定义域对我来说毫无意义。此外,我认为它不会解决我的问题,因为它的唯一目标似乎是创建自定义域:

SSL 端点仅对自定义域有用。全部默认 appname.herokuapp.com 域已经启用 SSL 并且可以 使用https访问,例如https://appname.herokuapp.com

我用谷歌搜索了几天,似乎无法找到解决方案。在我的 tomcat 端禁用 ssl 在我看来是不可接受的,因为它会带来太多风险。如果这能解决我的问题,我什至会考虑其他服务(Azure 等)。

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: java tomcat ssl heroku spring-boot


    【解决方案1】:

    使用 Heroku,要使用您自己的自定义 SSL,您需要使用自定义域和 SSL 端点插件,这可能对您的情况没有意义,但这是使用您自己的唯一方法证书。

    我还没有尝试过所有的提供商,但是我尝试过的那些,场景完全一样,只有在使用自定义域时才能使用自定义 SSL 证书。

    虽然,稍微浏览一下谷歌,发现这个blog post 说明了如何使用中间 DNS 服务与 Heroku 通信。在DNS服务和Heroku之间的通信中,使用了提供的heroku SSL证书,但是从客户端到DNS服务使用了不同的证书,所以它可能会有所帮助。

    更新:一个可能的解决方案是使用 Amazon Web Services,其中的交易是您租用虚拟机并允许您设置自己的环境,这意味着您可以安装自己的 tomcat 和使用您自己的自定义 SSL。

    更新 2:还有 CloudFront 和 AWS,您可以在其中使用自己的证书 explained here

    【讨论】:

    • 这有点烦人,因为托管站点应该只提供一个简单的平台来运行嵌入式 tomcat 应用程序,而不需要任何额外的东西。通过添加搭载 ssl,他们实际上为消费者制造了更多问题。我现在可能只需要支付 20 美元来在 SSL Endpoint 插件上托管我的 ssl 证书,而它可以通过让我的嵌入式 tomcat 完成所有工作来免费提供。
    • 我能问一下您尝试过哪些提供商,这样我也不会尝试吗?这可能会节省我一些时间。
    • 主要是 Openshift 和 Heroku。虽然我想到了一个可能的解决方案,所以我会更新答案。
    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 2021-03-17
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多