我正在使用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
)?
答案 0 :(得分:0)
它应该有用。
重现的步骤:
keytool -genkey -alias MyKey -keyalg RSA -keysize 2048 -keystore conf/store.jks
(然后在交互式Q / A会话期间使用相同的商店和密钥密码,例如“blablastore”)
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文件