scala - 在生产环境中为 play 2.4 配置 HTTPS : Unable to find HTTPS keystore

标签 scala ssl https playframework

背景

我在 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/

相关文章:

scala - 具有类型参数限制的 Scala 泛型类的条件方法

python - 如何在python中导入ssl、socket模块

node.js - 创建用于 Node.js 的 SSL 证书

ajax - Cordova Https ajax 请求失败或编码响应

php - 执行 FQL 时出现 SSL 证书问题

java - 创建证书时 IP 地址作为主机名 (CN)? (HTTPS 主机名错误 : should be <ipAddress>)

scala - 案例类、模式匹配和可变参数

scala - sbt 几乎每次都重新编译所有内容

scala - 函数与整数值比较时产生 Spark

javascript - 使用 Service Worker 缓存非 SSL 请求