背景
我在 Scala 中使用 play 2.4。我正在尝试启用 Https 进行游戏。我已经生成了一个 keystore test.jks
并将其放在我的 Play 应用程序的 /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 文件以及在我们应用程序的目标/通用文件夹中运行应用程序所需的脚本
。
因此,我尝试在使用 dist task
生成的 script
时启用 https
,如下所示:
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。
问题
为什么 play 在使用 sbt dist
时找不到 HTTPS keystore(test.jks
)?
最佳答案
这对我使用 dist
的生产有用
将你的 jks 文件放在 /home/ubuntu/
文件夹中,并尝试在 application.conf 中提供绝对路径 /home/ubuntu/test.jks
。
注意:从 /path/to/application/target/universal/app-1.0-SNAPSHOT/conf/application.conf 编辑 application.conf 文件
关于scala - 在生产环境中为 play 2.4 配置 HTTPS : Unable to find HTTPS keystore,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47792550/