Akka Streams и поддержка TLS: Catching Исключения

голоса
0

У нас есть приложение, которое решает соединения TCP, а также используют AKKA Актер. Нам нужно, чтобы добавить поддержку TLS для соединений Tcp, поэтому мы пошли с поддержкой Akka TLS с использованием паров и BidiFlow.

Хотя мы получили его работу, мы столкнулись с проблемами диагностирования проблемы, как исключения Рукопожатия. Используя -Djavax.net.debug=ssl,handshake,failureмы можем видеть информацию журнала в консоли, но это практически нечитаемые , и нет никакого способа , клиент может определить проблему с этим журналом. Попытка Try / уловы в коде не работает, и при входе в Акку отладки мы просто получаем:

2018-11-07 16: 31: 13607 ОТЛАДКА akka.stream.impl.io.TLSActor
система / StreamSupervisor-1 / поток-0-1
закрытие выходного

С флагом javax дальше, мы видим некоторые исключения бросали, но нет никакого способа, чтобы захватить их в коде, а не только для отладки, но и для закрытия соединения, когда рукопожатие строя (что, по-видимому, не происходит автоматически при отказе рукопожатия) ,

Каждый знает, как войти или поймать эти исключения ??

Вот код, который управляет создал TLSGraphs:

object Tls {

  def getGraph(tlsConfig: TlsConfig, role: TLSRole):
  BidiFlow[ByteString, ByteString, ByteString, ByteString, NotUsed] = {
    val sslContext = createSslContext(tlsConfig)
    val firstSession = createFirstSession(sslContext, tlsConfig.clientAuth)
    createGraph(sslContext, firstSession, role)
  }

  private def createFirstSession(sslContext: SSLContext, clientAuth: Boolean): NegotiateNewSession = {
    val negotiatedSession = TLSProtocol.NegotiateNewSession
      .withProtocols(TLSv1.2)
      .withCipherSuites(
        TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
        TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
      )
      .withParameters(sslContext.getDefaultSSLParameters)
      //.withClientAuth(TLSClientAuth.none)

    negotiatedSession
  }

  private def createSslContext(tlsConfig: TlsConfig): SSLContext = {
    val ksTrust = createKeyStore(tlsConfig.trustStoreType, tlsConfig.trustStoreFile, tlsConfig.trustStorePass)
    val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm)
    trustManagerFactory.init(ksTrust)

    val ksKeys = createKeyStore(tlsConfig.keyStoreType, tlsConfig.keyStoreFile, tlsConfig.keyStorePass)
    val keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm)
    keyManagerFactory.init(ksKeys, tlsConfig.keyStorePass.toCharArray)

    val sslContext = SSLContext.getInstance(TLSv1.2)
    sslContext.init(keyManagerFactory.getKeyManagers, trustManagerFactory.getTrustManagers, new SecureRandom)
    sslContext
  }

  private def createKeyStore(storeType: String, file: String, password: String): KeyStore = {
    val keyStore: KeyStore = KeyStore.getInstance(storeType)
    keyStore.load(new FileInputStream(file), password.toCharArray)
    keyStore
  }

  private def createGraph(
                           sslContext: SSLContext,
                           firstSession: NegotiateNewSession,
                           role: TLSRole)
  : BidiFlow[ByteString, ByteString, ByteString, ByteString, NotUsed] = {

    val tls: BidiFlow[TLSProtocol.SslTlsOutbound, ByteString, ByteString, TLSProtocol.SslTlsInbound, NotUsed] =
      TLS(sslContext, firstSession, role)

    val tlsSupport: BidiFlow[ByteString, TLSProtocol.SslTlsOutbound, TLSProtocol.SslTlsInbound, ByteString, NotUsed] =
      BidiFlow.fromFlows(
        Flow[ByteString].map(TLSProtocol.SendBytes),
        Flow[TLSProtocol.SslTlsInbound].map {
          case TLSProtocol.SessionBytes(_, bytes) => bytes
          case TLSProtocol.SessionTruncated =>
            throw ProcessingException(TLS session truncated)
          case _ =>
            throw ProcessingException(Unexpected type received from TLS pipeline)
        })

    tlsSupport.atop(tls)
  }
}
Задан 07/11/2018 в 20:04
источник пользователем
На других языках...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more