Heroku:使用https tomcat服务器和证书固定的Spring Boot Gradle应用程序

Sim*_*mon 7 java ssl tomcat heroku spring-boot

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

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

compile 'org.springframework.boot:spring-boot-starter-tomcat'
Run Code Online (Sandbox Code Playgroud)

现在,我启用了https/ssl:

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

我必须启用SSL,因为我希望我的android前端安全地与我的服务器通信.我使用称为证书锁定的技术,这意味着我将相同的自签名证书添加到我的服务器和我的Android应用程序.对于两者之间的任何http通信,通信将使用相同证书的密钥加密,因此服务器和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
Run Code Online (Sandbox Code Playgroud)

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

作为旁注,Heroku应用程序默认启用https.我正在安装的服务器已将Tomcat配置为使用https,并且尝试访问端点时返回代码= H13 desc ="连接已关闭且无响应"错误.删除该配置后,错误消失了.

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

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

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

SSL端点仅对自定义域有用.所有默认的appname.herokuapp.com域都已启用SSL,可以使用https访问,例如https://appname.herokuapp.com.

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

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

sal*_*ama 3

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

我还没有尝试过所有的提供商,但对于我尝试过的提供商,情况完全相同,只有当您使用自定义域时才可以使用自定义 SSL 证书。

不过,浏览了一下 google,发现了这篇博文,其中说明了如何使用中间 DNS 服务与 Heroku 进行通信。在 DNS 服务和 Heroku 之间的通信中,使用提供的 heroku SSL 证书,但从客户端到 DNS 服务使用不同的证书,因此可能会有所帮助。

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

更新 2:还有 AWS 的 CloudFront,您可以在其中使用您自己的证书(此处解释)