如何配置播放! 2.4.2 HTTPS密钥库?

时间:2015-07-31 10:39:25

标签: java playframework playframework-2.0

我是Play Framework的新手,只是尝试在Java 8上使用2.4.2首次使用HTTPS。我可以使用默认密钥库但不能使用自己的密钥库。我在build.sbt中配置了工作默认密钥库:

javaOptions ++= Seq(
    "-Dhttps.port=9443"
)

然后用于配置您自己的密钥库的official documentation对我来说有点过于抽象。它提到在application.conf中配置它,但没有说明如何,或者在命令行上,而不是在Java示例中。谷歌搜索显示了一些Scala示例,但我不能哄骗他们,因为他们使用devSettings似乎没有看到Java世界的东西,或者至少我不理解Play和Scala足以抓住它们在他们身上。

据我所知,我似乎在build.sbt中使用了我自己的独特配置:

javaOptions ++= Seq(
    "-Dhttps.port=9443",
    "-Dhttps.keyStore.path=keystore.jks",
    "-Dhttps.keyStore.password=password")

它构建并运行正常:

p.c.s.NettyServer - Listening for HTTPS on port /0:0:0:0:0:0:0:0:9443
play.api.Play - Application started (Dev)

但是在第一个https://访问中,我在Actuator UI中获得了无限的堆栈跟踪:

play.core.server.NettyServer$PlayPipelineFactory - cannot load SSL context
java.lang.reflect.InvocationTargetException: null
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_45]
    ...
play.core.server.netty.PlayDefaultUpstreamHandler - Exception caught in Netty
java.lang.IllegalArgumentException: empty text
    at org.jboss.netty.handler.codec.http.HttpVersion.<init>(HttpVersion.java:89) ~[netty-3.10.3.Final.jar:na]
    ...

我的第一个想法是我没有正确配置它,但我还没有设法找到Play 2.4的权威指南。我真的开始质疑我的谷歌搜索权力。我发现许多对前端代理的引用并避免在Play中使用SSL终止,但我没有开发公共网站并发现这种方法有点过分。

我不知道它是不是红鲱鱼,但Netty项目很久以前就放弃了org.jboss.netty,现在使用io.netty。我看到整个堆栈跟踪org.jboss.netty和Play 2.4.2似乎都在使用Netty 3.10.3.Final这是非常古老的。我碰巧熟悉Netty并且在生产中使用了4.x,而5.x目前在Alpha中。为什么Play在这里被困?我应该担心吗?

我发现了一些看似密切相关的问题,例如a bug in Play 2.2.xa bug in AHC(Play使用),但两者似乎都已经在我使用的Play 2.4.2之前修好了。不过我尝试了一些修复,例如升级async-http-client依赖项,从async-http-client中排除org.jboss.netty传递依赖项并升级到Netty 3.10.4.Final。

所以现在我被困了,但我觉得我只是错过了入门指南。也许所有这些依赖性问题和相关的错误只是浪费时间?

1 个答案:

答案 0 :(得分:7)

在发布问题后5分钟我发现了...我的配置键错误密钥库路径需要是绝对的或相对于项目的root(即在conf文件夹中添加conf / if):

javaOptions ++= Seq(
    "-Dhttps.port=9443",
    "-Dhttps.keyStore=conf/keystore.jks",
    "-Dhttps.keyStorePassword=password")

我对密钥的错误是使用了点per the documentation

https.keyStore.path
https.keyStore.password

而不是:

https.keyStore
https.keyStorePassword

我不确定如何从dot.notation到camelCase,甚至不知道我在这里配置的是什么。这些参数更像是标准JVM参数javax.net.ssl.keyStorejavax.net.ssl.keyStorePassword,但并不完全。我觉得我在这里错过了一招。如果Play报告说它找不到密钥库而不是NPE也会很好,但是因为我似乎正在配置JVM,所以除非有另一种方法,否则Play可以做些什么。配置这个东西......有不错的文档!