2015-07-31 12 views
9

Sono nuovo nel Play Framework e sto solo cercando di far funzionare HTTPS per la prima volta con 2.4.2 su Java 8. Posso farlo funzionare con il keystore predefinito ma non con il mio keystore. Ho configurato l'archivio di chiavi di default lavorare in build.sbt:Come configurare Play! 2.4.2 Keystore HTTPS?

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

Poi il official documentation per configurare il proprio chiavi diventa un po 'troppo astratto per me. Menziona la sua configurazione in application.conf ma non dice come, o sulla riga di comando ma non con un esempio Java. Googling rivela alcuni esempi di Scala ma non li posso ingannare perché usano cose come devSettings che non sembrano venire in contatto con il mondo Java, o almeno non capisco Play e Scala abbastanza da riuscire a controllarle.

Quindi per quanto ne so mi sembra di usare la mia propria configurazione unica in build.sbt:

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

Si costruisce e gestisce ok:

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

Ma sui primi https: // accesso ottengo una traccia stack infinita nell'interfaccia utente attuatore:

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] 
    ... 

Il mio primo pensiero è che non sono confi guring correttamente ma non sono riuscito a trovare una guida definitiva per Play 2.4. Sto seriamente iniziando a mettere in discussione i miei poteri su Google. Trovo molti riferimenti ai proxy front-end ed evito la terminazione SSL in Play, ma non sto sviluppando un sito Web pubblico e trovo che questo approccio sia eccessivo.

Non so se si tratta di una falsa pista ma il progetto Netty ha lasciato cadere lo org.jboss.netty molto tempo fa e ora utilizza io.netty. Vedo org.jboss.netty su tutta la traccia dello stack e Play 2.4.2 sembra utilizzare Netty 3.10.3.Final che è molto vecchio. Ho familiarità con Netty e ho usato 4.x in produzione mentre 5.x è attualmente in Alpha. Perché Play è bloccato in passato qui? Dovrei essere preoccupato?

Ho trovato diversi problemi che sembrano strettamente correlati come a bug in Play 2.2.x e a bug in AHC (che Play utilizza), ma entrambi sembrano essere stati risolti molto prima del Play 2.4.2 che sto usando. Tuttavia ho provato delle correzioni come l'aggiornamento della dipendenza async-http-client, escludendo la dipendenza transitiva org.jboss.netty da async-http-client e l'aggiornamento a Netty 3.10.4.Final.

Così ora sono bloccato, ma mi sento come se mi mancasse una guida introduttiva. Forse tutti questi problemi di dipendenza e bug correlati sono solo una perdita di tempo?

+0

https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#InstallationAndCustomization –

+0

@WillSargent Stai dicendo che io _am_ impostando direttamente parametri JVM qui con 'javaOptions' ? Dovrebbe essere il mio obiettivo? Cioè non c'è un altro modo per applicare queste impostazioni con qualcosa come 'devSettings'? Non sono sicuro di cosa otterrei qui, ma forse più controllo sulle diverse distribuzioni di sviluppo e produzione? Sembra anche che queste opzioni Java non si applichino ai miei test (non è possibile testare l'applicazione ssl). Questo è probabilmente dovuto alla mia mancanza di comprensione con il framework di testing tanto quanto qualsiasi altra cosa, ma come ho detto mi sento come se avessi configurato lo ssl al livello sbagliato. – Josh

risposta

7

Quindi 5 minuti dopo la pubblicazione la domanda che ho capito ... I miei chiavi di configurazione erano sbagliate e il percorso chiavi doveva essere assoluto o relativo alla radice del progetto (vale a direaggiungere conf/se è nella cartella conf):

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

Il mio errore con le chiavi è stato quello di utilizzare i punti per the documentation:

https.keyStore.path 
https.keyStore.password 

Invece di:

https.keyStore 
https.keyStorePassword 

io non sono certo come si ottiene da dot.notation a camelCase o anche cosa esattamente sto configurando qui. Questi parametri sono più simili agli argomenti JVM standard javax.net.ssl.keyStore e javax.net.ssl.keyStorePassword, ma non del tutto. Mi sento come se mi mancasse un trucco qui. Sarebbe anche bello se Play riferisse che non riusciva a trovare il keystore piuttosto che un NPE, ma dal momento che sembra che io stia configurando la JVM forse non c'è nulla che Play possa fare a meno che non ci sia un altro modo per configurare questa roba. con una documentazione decente!

+0

Le impostazioni della documentazione HTTPS dovrebbero apparire in application.conf, ma dovrebbero anche funzionare dalle proprietà di sistema. Puoi presentare un problema su https://github.com/playframework/playframework/issues e darò un'occhiata? –

+0

Inoltre, il codice sorgente per il provider SSL Engine (che configura HTTPS per Play) è qui: https://github.com/playframework/playframework/blob/master/framework/src/play-server/src/main/scala /play/core/server/ssl/DefaultSSLEngineProvider.scala#L27 –

+0

Come stavi gestendo la tua applicazione quando stavi riscontrando che la configurazione tramite application.conf non funzionava? – dhpiggott

Problemi correlati