2016-04-17 17 views
2

小さなプロキシを作成して、すべてのローカルhttpリクエストを傍受し、リモートプロキシで認証しました。コードスニペットは次のとおりです。Akka-httpでHTTPSリクエストを処理する[java]

Source<IncomingConnection, CompletionStage<ServerBinding>> serverSource = 
       Http.get(system).bind(ConnectWithHttps.toHost("localhost", LOCAL_PORT), materializer); 
     Authorization authorization = Authorization.basic(USERNAME, PASSWORD); 

     Flow<HttpRequest, HttpRequest, NotUsed> applySecurity = 
       Flow.of(HttpRequest.class) 
        .map(request -> request.addHeader(authorization)); 

     Flow<HttpRequest, HttpResponse, CompletionStage<OutgoingConnection>> forwardToProxy = 
       Http.get(system).outgoingConnection(ConnectWithHttps.toHost(PROXY_ADDRESS, PROXY_PORT)); 

     Flow<HttpRequest, HttpResponse, NotUsed> handler = 
       Flow.of(HttpRequest.class) 
        .via(applySecurity) 
       .via(forwardToProxy); 


    serverSource.to(Sink.foreach(conn -> { 
      System.out.println("Accepted new connection from " + conn.remoteAddress()); 
      conn.handleWith(handler, materializer); 
       } 
)).run(materializer); 

また、Httpsリクエストも処理する必要があります。しかし、私はいつもこのエラーが出る:

[WARN] [04/14/2016 00:07:28.480] [MyActorSystem-akka.actor.default-dispatcher-13] [akka.actor.ActorSystemImpl(MyActorSystem)] Illegal request, responding with status '400 Bad Request': Request is missing required `Host` header: 'Host' header value of request to `eg.linkedin.com:443` doesn't match request target authority: Host header: Some(Host: eg.linkedin.com:443) 

私は「ConnectWithHttps」の代わりに「ConnectHttp」を使用しようとしましたが、それはしませんでした。私はHttpsに関連する例を見つけることができませんでした

ありがとう、ありがとう?

注:

Documentation has no example specially in Java

よろしく、

Bassam

答えて

1

ConnectWithHttps.toHost("localhost", LOCAL_PORT).withCustomHttpsContext(ctx) 

ConnectWithHttps.toHost("localhost", LOCAL_PORT) 

を変更しよう

これを行うには、HttpsConnectionContextを作成する必要があります(ctx)。あなたがそれを行う方法の簡単な例:

char[] password = config.getString("https.password").toCharArray(); 
SSLContext context = SSLContext.getInstance("TLS"); 
KeyStore ks = KeyStore.getInstance("PKCS12"); 

ks.load(App.class.getClassLoader().getResourceAsStream("keys/server.p12"), password); 
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); 

keyManagerFactory.init(ks, password); 
context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom()); 

HttpsConnectionContext ctx = ConnectionContext.https(context); 
+0

ありがとう@eudgee、私はこれを試してみます。私はこの[scalaの例](https://www.codatlas.com/github.com/akka/akka/HEAD/akka-http-core/src/test/scala/akka/http/impl/util)の証明書を使用しています/ExampleHttpContexts.scala) –