我有一个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
根据朱莉的博客:http://juliekrueger.com/blog/
我可以通过仅从tomcat服务器中删除ssl/https来解决错误,但是正如我提到的,我想使用证书固定技术进行安全通信。
我当时在想是否可以在heroku端禁用SSL,但是要保持我的tomcat服务器SSL处于 Activity 状态,但是我已经联系了Heroku,他们告诉我,不能禁用其服务随附的标准搭载SSL。
我还在这里查看了称为SSL Endpoint的付费替代方案,但它似乎仅对自定义域有用。由于所有端点都在我的android应用程序中编码,并且用户不可见,因此使用自定义域对我来说毫无意义。此外,我认为它不会解决我的问题,因为它的唯一目的似乎是创建自定义域:
我现在用Google搜寻了几天,似乎无法提出解决方案。在我的脑海中禁用ssl在我看来是 Not Acceptable ,因为这会带来太多风险。如果这可以解决我的问题,我什至会考虑其他服务(Azure等)。
关于如何解决这个问题有什么想法吗?
最佳答案
对于Heroku,要使用自己的自定义SSL,您需要使用自定义域和SSL Endpoint插件,这可能对您的情况没有意义,但这是使用自己的证书的唯一方法。
而且我还没有尝试所有提供程序,但是与我尝试过的提供程序完全相同,情况只有在使用自定义域的情况下才可以使用自定义SSL证书。
虽然,浏览一下Google,发现了这个blog post,它说明了如何使用中间DNS服务与Heroku通信。在DNS服务和Heroku之间的通信中,使用了提供的heroku SSL证书,但是从客户端到DNS服务使用了不同的证书,因此可能会有帮助。
更新:一种可能的解决方案是使用Amazon Web Services,其协议(protocol)是租用VM,并允许您设置自己的环境,这意味着您可以安装自己的tomcat并使用自己的自定义SSL。
更新2 :还有AWS的CloudFront,您可以在其中使用自己的证书explained here