Мой application.conf:
play.server.https.keyStore {
path = "conf/cacert.jks"
type = "JKS"
password = "n0t_@_$ecret!"
}
В папке conf у меня cacert.jks
DefaultSSLEngineProvider не может прочитать файл с относительным путем, условие для этого линия не соблюдается:
2018-05-14 10:44:23,502 ERROR play.core.server.AkkaHttpServer - Cannot load SSL context
java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at play.core.server.ssl.ServerSSLEngine$.createScalaSSLEngineProvider(ServerSSLEngine.scala:103)
at play.core.server.ssl.ServerSSLEngine$.createSSLEngineProvider(ServerSSLEngine.scala:35)
at play.core.server.AkkaHttpServer$$anonfun$7.apply(AkkaHttpServer.scala:126)
at play.core.server.AkkaHttpServer$$anonfun$7.apply(AkkaHttpServer.scala:124)
at scala.Option.map(Option.scala:146)
at play.core.server.AkkaHttpServer.<init>(AkkaHttpServer.scala:124)
at play.core.server.AkkaHttpServerProvider.createServer(AkkaHttpServer.scala:464)
at play.core.server.AkkaHttpServerProvider.createServer(AkkaHttpServer.scala:462)
at play.core.server.ServerProvider$class.createServer(ServerProvider.scala:25)
at play.core.server.AkkaHttpServerProvider.createServer(AkkaHttpServer.scala:462)
at play.core.server.ProdServerStart$.start(ProdServerStart.scala:57)
at play.core.server.ProdServerStart$.main(ProdServerStart.scala:25)
at play.core.server.ProdServerStart.main(ProdServerStart.scala)
Caused by: java.lang.Exception: Unable to find HTTPS keystore at "/api/target/universal/stage/conf/cacert.jks"
at play.core.server.ssl.DefaultSSLEngineProvider.createSSLContext(DefaultSSLEngineProvider.scala:56)
at play.core.server.ssl.DefaultSSLEngineProvider.<init>(DefaultSSLEngineProvider.scala:24)
... 17 common frames omitted





Одно из решений - реализовать пользовательский SSLEngineProvider:
package utils
import java.io.File
import com.typesafe.config.{Config, ConfigValueFactory}
import javax.net.ssl._
import play.api.Configuration
import play.core.ApplicationProvider
import play.core.server.ServerConfig
import play.core.server.ssl.DefaultSSLEngineProvider
import play.server.api._
class CustomSSLEngineProvider(svrCfg: ServerConfig, appProv: ApplicationProvider)
extends SSLEngineProvider {
val KEYSTORE_PATH: String = "play.server.https.keyStore.path"
val config = svrCfg.configuration.underlying
val keyStoreFile: File = appProv.current.get.environment.getFile(
config.getString(KEYSTORE_PATH))
// We override relative path with absolute path - it is needed for DefaultSSLEngineProvider!
val configWithFixedKeystorePath: Config = config.withValue(KEYSTORE_PATH,
ConfigValueFactory.fromAnyRef(keyStoreFile.getAbsolutePath))
val fixedSvrCfg: ServerConfig = svrCfg.copy(
configuration = Configuration(configWithFixedKeystorePath))
private val sslEngineProv = new DefaultSSLEngineProvider(fixedSvrCfg, appProv)
override def createSSLEngine(): SSLEngine = {
sslEngineProv.createSSLEngine()
}
}
И передайте его как системное свойство, например:
-Dplay.server.https.engineProvider=utils.CustomSSLEngineProvider