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

标签 java tomcat ssl heroku spring-boot

我有一个 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 通信,通信将使用相同证书的 key 加密,因此服务器和 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/

As a side note, Heroku apps are https enabled by default. The server I was installing had Tomcat configured to use https, and trying to access an endpoint was returning a code=H13 desc="Connection closed without response" error. After I removed that configuration the error went away.

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

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

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

SSL Endpoint is only useful for custom domains. All default appname.herokuapp.com domains are already SSL-enabled and can be accessed by using https, for example, https://appname.herokuapp.com.

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

关于如何解决这个问题有什么想法吗?

最佳答案

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

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

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

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

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

关于java - Heroku:带有 https tomcat 服务器和证书固定的 Spring Boot Gradle 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34231865/

相关文章:

java - 如何在动态sql搜索中使用LIKE?

java - 从 AsyncTask 触发时 SQLiteOpenHelper.getWritableDatabase 上出现 NullPointerException

java - org.springframework.webflow.util.RandomGuid 上的错误 java.lang.NoClassDefFoundError

android - 如何使用 OKHTTP 处理新证书?

.net - 如何将 'ServerCertificateValidationCallback' 属性设置回其默认行为?

ruby - 当我尝试调用 Google Geocode API 时出现 SSL 错误

java - 如何在此 ubuntu 终端命令 : "javac Main.java && java Main"? 中仅引用一次 Main

tomcat - 使用 pem 文件在 tomcat 上启用 SSL

spring - Tomcat...网络应用启动顺序

java - 在 HTML 标签之间提取数据