2016-01-25 21 views
5

Sto tentando di aggiungere un certificato autofirmato alla mia configurazione per fare in modo che il mio servizio Web offra contenuti su SSL ma non ho avuto fortuna.Akka HTTP 2.0 per utilizzare SSL (HTTPS)

Ecco il mio attuale configurazione

ssl { 
    jksKeystore = "localhost.p12" 
    password = "changeit" 
} 

Tutte le idee su quello che sto misisng di essere in grado di girare su un server HTTPS?

Il mio progetto sta usando Akka 2.0 e Scala

+1

C'è una sezione su HTTPS dimensioni del server nella documentazione: [lato server HTTPS Supporto] (http://doc.akka.io/docs/akka- stream-and-http-experimental/2.0.2/scala/http/low-level-server-side-api.html # server-side-https-support) – planetenkiller

+1

Si consiglia di utilizzare apache o nginx come server proxy https. È più veloce (dovuta all'implementazione C++) e spesso aggiornato (popolarità dovuta) – mgosk

risposta

8

Ci sono alcuni test nella base di codice Akka che mettono alla prova la funzionalità https. Utilizzano i contesti http predefiniti definiti in ExampleHttpContexts.

Ho creato un piccolo repository che utilizza le chiavi dal repository akka (spero non gli dispiacerà) e crea un server https minimo utilizzando un certificato autofirmato here. Fatto come un repo invece che come un succo, quindi puoi semplicemente clonarlo per iniziare.

Ecco il codice Scala:

package httpsserver 

import java.security.{SecureRandom, KeyStore} 
import javax.net.ssl.{KeyManagerFactory, SSLContext} 

import akka.actor.ActorSystem 
import akka.http.scaladsl.{HttpsContext, Http} 
import akka.http.scaladsl.server.Directives._ 
import akka.http.scaladsl.server.Route 
import akka.stream.ActorMaterializer 

object Server extends App { 

    val serverContext: HttpsContext = { 
    val password = "abcdef".toCharArray 
    val context = SSLContext.getInstance("TLS") 
    val ks = KeyStore.getInstance("PKCS12") 
    ks.load(getClass.getClassLoader.getResourceAsStream("keys/server.p12"), password) 
    val keyManagerFactory = KeyManagerFactory.getInstance("SunX509") 
    keyManagerFactory.init(ks, password) 
    context.init(keyManagerFactory.getKeyManagers, null, new SecureRandom) 
    // start up the web server 
    HttpsContext(context) 
    } 

    implicit val system = ActorSystem("server") 
    implicit val materializer = ActorMaterializer() 
    import system._ 

    val route = Route(complete("ok")) 

    Http().bindAndHandle(route, interface = "0.0.0.0", port = 8081, httpsContext = Some(serverContext)) 
} 
+1

È fantastico, è un peccato che non ci sia un esempio ufficiale nella documentazione di akka-http. –

+1

I documenti akka-http lasciano molto a desiderare. Spero che questo migliorerà una volta che akka-http è integrato con Akka 2.4. –

+0

Hai idea di quando succederà? (qualsiasi parola ufficiale su di esso) –