在生产中为play 2.4配置Https:无法找到HTTPS密钥库

时间:2017-12-13 12:03:20

标签: scala ssl https playframework

背景

我正在使用scala使用播放2.4 。我正在尝试启用 Https 进行播放。我已经生成了一个密钥库test.jks并将其放在我的播放应用程序的/conf内。我在application.conf

中有以下设置
play.crypto.secret= "my application secret"
play.server.https.keyStore.path = "conf/test.jks"
play.server.https.keyStore.type = "JKS"
play.server.https.keyStore.password = "my keystore password"

然后,当我使用以下命令启动我的应用程序时,https已成功启用:

sbt "start -Dhttps.port=9001"

这意味着,我现在可以访问https://localhost:9001并访问http://localhost:9000

问题

根据我的要求,我使用sbt dist来部署我的应用程序。我们知道,dist生成一个ZIP文件,其中包含所有JAR文件以及在应用程序的target / universal文件夹中运行应用程序所需的script

因此,我尝试在使用https生成的script时启用dist task,如下所示:

bin/my-app -Dconfig.resource=application.conf -Dhttp.port=9000 -Dhttps.port=9001

现在,我可以http://localhost:9000访问我的应用,但无法访问https://localhost:9001。以下是我的应用程序日志的内容:

[[37minfo[0m] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
[[37minfo[0m] p.c.s.NettyServer - Listening for HTTPS on port /0:0:0:0:0:0:0:0:9001
[[31merror[0m] p.c.s.NettyServer$PlayPipelineFactory - cannot load SSL context
java.lang.reflect.InvocationTargetException: null
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_151]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_151]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_151]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_151]
    at play.core.server.ssl.ServerSSLEngine$.createScalaSSLEngineProvider(ServerSSLEngine.scala:96) ~[com.typesafe.play.play-server_2.11-2.4.6.jar:2.4.6]
Caused by: java.lang.Exception: Unable to find HTTPS keystore at "/my_path_to_project/target/universal/my-app-1.0/my-app/conf/test.jks"
    at play.core.server.ssl.DefaultSSLEngineProvider.createSSLContext(DefaultSSLEngineProvider.scala:53) ~[com.typesafe.play.play-server_2.11-2.4.6.jar:2.4.6]
    at play.core.server.ssl.DefaultSSLEngineProvider.<init>(DefaultSSLEngineProvider.scala:21) ~[com.typesafe.play.play-server_2.11-2.4.6.jar:2.4.6]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_151]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_151]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_151]
[[31merror[0m] p.c.s.n.PlayDefaultUpstreamHandler - Exception caught in Netty
java.lang.IllegalArgumentException: empty text
    at org.jboss.netty.handler.codec.http.HttpVersion.<init>(HttpVersion.java:89) ~[io.netty.netty-3.10.4.Final.jar:na]
    at org.jboss.netty.handler.codec.http.HttpVersion.valueOf(HttpVersion.java:62) ~[io.netty.netty-3.10.4.Final.jar:na]
    at org.jboss.netty.handler.codec.http.HttpRequestDecoder.createMessage(HttpRequestDecoder.java:75) ~[io.netty.netty-3.10.4.Final.jar:na]
    at org.jboss.netty.handler.codec.http.HttpMessageDecoder.decode(HttpMessageDecoder.java:191) ~[io.netty.netty-3.10.4.Final.jar:na]
    at org.jboss.netty.handler.codec.http.HttpMessageDecoder.decode(HttpMessageDecoder.java:102) ~[io.netty.netty-3.10.4.Final.jar:na]
[[31merror[0m] p.c.s.n.PlayDefaultUpstreamHandler - Exception caught in Netty

上面日志中有趣的是这部分:Unable to find HTTPS keystore at "/my_path_to_project/target/universal/my-app-1.0/my-app/conf/test.jks"

但是,当我检查时,我确实在/target/universal/my-app-1.0/my-app/conf/内创建了test.jks。

问题

为什么在使用test.jks时播放无法找到HTTPS密钥库(sbt dist)?

3 个答案:

答案 0 :(得分:0)

它应该有用。

重现的步骤:

密钥存储生成

keytool -genkey -alias MyKey -keyalg RSA -keysize 2048 -keystore conf/store.jks

(然后在交互式Q / A会话期间使用相同的商店和密钥密码,例如“blablastore”)

application.conf

play.crypto.secret= "just secret"
play.server.https.keyStore.path = "conf/store.jks"
play.server.https.keyStore.type = "JKS"
play.server.https.keyStore.password = "blablastore"

部署

sbt dist
cd target/universal/
unzip *.zip
cd <project-name-1.0-SNAPSHOT>

运行

bin/<project-name> -Dconfig.resource=application.conf -Dhttp.port=9000 -Dhttps.port=9001

答案 1 :(得分:0)

由于您使用config.resource,这意味着Play将在资源JAR中查找文件。这也意味着你的密钥库需要在jar中。

你需要检查是否是这种情况。

答案 2 :(得分:0)

这对我来说可以使用dist

进行生产

将jks文件放入/home/ubuntu/文件夹中,并尝试在application.conf中给出绝对路径/home/ubuntu/test.jks

注意:编辑/path/to/application/target/universal/app-1.0-SNAPSHOT/conf/application.conf中的application.conf文件