2016-03-26 5 views
0

Ich versuche eine sichere Verbindung zu meinem akka-http-Server (localhost) herzustellen, indem ich ein selbstsigniertes Zertifikat verwende. Ich war nicht erfolgreich.Akka Http HTTPS-Konfiguration, die dazu führt, dass Chrome zurückkehrt ERR_SSL_VERSION_OR_CIPHER_MISMATCH

Die Akka-http-Dokumente auf SSL ist ein wenig vage. Ich habe versucht, Informationen von überall her zu sammeln, aber ich kann immer noch nicht funktionieren.

I wie unten erstellt ein ssl Merkmal:

trait MySslConfiguration { 

    def serverContext: HttpsContext = { 
    val password = "password".toCharArray 
    val context = SSLContext.getInstance("TLSv1.2") 
    val keyStore = KeyStore.getInstance("jks") 
    val keyStoreResource = "/scruples_keystore.jks" 
    val keyManagerFactory = KeyManagerFactory.getInstance("SunX509") 
    val trustManagerFactory = TrustManagerFactory.getInstance("SunX509") 
    keyStore.load(getClass.getClassLoader.getResourceAsStream(keyStoreResource), password) 
    keyManagerFactory.init(keyStore, password) 
    trustManagerFactory.init(keyStore) 
    context.init(keyManagerFactory.getKeyManagers, trustManagerFactory.getManagers, new SecureRandom()) 
    val sslParams = context.getDefaultSSLParameters 
    sslParams.setEndpointIdentificationAlgorithm("HTTPS") 
    HttpsContext(sslContext = context 
    sslParameters = Some(sslParams), 
    enabledProtocols = Some(List("TLSv1.2", "TLSv1.1", "TLSv1"))) 
    } 

} 

füge ich das Merkmal meines Serverstart wie folgt:

object Main extends App with Core with RestInterface with MySslConfiguration { 
    val metricRegistry = new com.codahale.metrics.MetricRegistry() 
    override implicit val injector = GlobalInjector.getInjector 
    override implicit val system: ActorSystem = injector.instance[ActorSystem] 

    override def config: Config = injector.instance[Config] 

    override implicit def executor: ExecutionContextExecutor = system.dispatcher 

    override val logger: LoggingAdapter = Logging(system, getClass) 
    override implicit val materializer: Materializer = ActorMaterializer() 


    val routes = allRoutes 

    Http().bindAndHandle(routes, config.getString("http.host"), config.getInt("http.port"), httpsContext = Some(serverContext)) 

Die selbstsignierte jks Schlüsselspeicher wie unten erstellt wurden:

keytool -genkey -keyalg RSA -keysize 2048 -keystore scruples_keystore.jks -alias myalias 

Kann mir bitte jemand helfen?

Was mache ich falsch? Ich bin mir sicher, dass es ein Konfigurationsproblem gibt, aber ich kann es nicht herausfinden.

Eine andere Frage ist, was würde sich ändern, wenn ich ein richtiges Zertifikat von einer CA verwenden würde?

Vielen Dank

+0

Akka Http verwendet die ssl-Config-Bibliothek, die ihre eigene umfangreiche Dokumentation hat: http://typesafehub.github.io/ssl- config/(wurde von Play-WS übernommen und als eigenständige Bibliothek extrahiert und jetzt auch von Akka-Http verwendet). Siehe auch das Projekt https://github.com/typesafehub/ssl-config –

+0

Danke, dass Sie mich in die richtige Richtung weisen. Ich habe die Konfiguration hinzugefügt, wie in den Dokumenten beschrieben, die Sie oben gepostet haben, aber ich kann es immer noch nicht zum Laufen bringen. Können Sie Beispielcode/Konfiguration für ein selbstsigniertes Zertifikat posten? Erstelle ich die Konfiguration und rufe 'SSLContext.getDefault' auf, damit ich den' HTTPContext' in der Bind-Methode beim Starten des Servers konfigurieren kann? Ich habe sogar versucht, 'ssl-config-ssl.default = true' zu ​​setzen und habe den Server immer noch nicht dazu gebracht, auf https-Anfragen zu antworten – fintis

Antwort

0

Es stellte sich so hin, dass der Schlüsselspeicher Standort als val keyStoreResource = "/scruples_keystore.jks" Angabe das Problem war. Angeben des Keystore-Standorts als val keyStoreResource = "scruples_keystore" hat den Trick und alles ist gut mit der Welt wieder ...

Verwandte Themen