【发布时间】: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