← Zur Übersicht

Akka.NET & SSL 👩🏻‍🔬

Mit Akka.NET v1.2.0 wurde DotNetty als Transport-Layer eingeführt. Das brachte einige interessante Features mit sich - u.a. die Möglichkeit, ein Akka.NET ActorSystem mit TLS abzusichern.

Die Implementierung ist insgesamt recht trivial. Jedoch gibt es ein paar Punkte zu beachten, die nirgendwo so recht dokumentiert sind und bei denen man sich beim ersten Umsetzungsversuch sprichwörtlich 'nen Wolf sucht (generell lässt die Dokumentation von Akka.NET Clustern mit DotNetty und TLS eher zu wünschen übrig). Daher wollen wir hier die notwendigen Implementierungsschritte einmal zusammenfassen.

Grundsätzlich ist bei einer TLS Einrichtung folgendes zu beachten (egal, ob für ein Cluster oder nicht):

  • Jeder Node muss dasselbe Zertifikat benutzen.
  • Es muss ein .pfx-Zertifikat verwendet werden.

Als kurzen Exkurs sei einmal vorab zusammengefasst, wie die Erstellung eines solchen Zertifikats unter Verwendung von open-ssl funktioniert:

  1. Einen Private Key generieren: openssl genrsa -des3 -out PKey.key 1024
  2. Einen CSR (Certificate Signing Request) für den Key erstellen: openssl req -new -key PKey.key -out CertReq.csr
  3. Ein Zertifikat erstellen (für Testzwecke funktioniert auch ein selbst erstelltes): openssl x509 -req -days 365 -in CertReq.csr -signkey PKey.key -out Cert.crt
  4. Mit Zertifikat und PKey ein pfx-Zertifikat erstellen: openssl pkcs12 -export -out PfxCert.pfx -inkey PKey.key -in Cert.crt -certfile Cert.crt

Hiermit haben wir ein gültiges .pfx-Zertifikat erstellt, das wir nun für die TLS-Konfiguration verwenden können.

Eine gültige .conf-Datei für einen Akka Cluster kann dann z.B. so aussehen:

akka {
    actor {
        provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"
    }
    remote {
        dot-netty.tcp {
            hostname = "127.0.0.1"
            port = 0
            enable-ssl = true
            log-transport = true
            ssl {
                suppress-validation = true
                certificate {
                    # valid ssl certificate must be installed on both hosts
                    path = "PfxCert.pfx"
                    password = "YourCertificatePasswordHere"
                }
            }
        }
    }
    cluster {
        seed-nodes = ["akka.ssl.tcp://SampleCluster@127.0.0.1:5000"]
        auto-down-unreachable-after = 2s
        roles = [api]
    }
}

Wichtig ist dabei, dass alle Seed-Nodes des Clusters, für die TLS benutzt werden soll, akka.ssl. als Addressenpräfix benutzen.

Ebenfalls darf nicht vergessen werden, dass für alle im Cluster vorhandenen Nodes dasselbe Zertifikat verwendet werden muss!

Happy Coding!

Quellen: