TLS - SSL-Konfiguration
Transport-Verschlüsselung
RabbitMQ lauscht ohne explizite Konfiguration auf unverschlüsselte Verbindungen auf Port 5672 und bietet eine Authentifizierung mit Benutzername und Passwort an. Um RabbitMQ zur Nutzung von TLS zur Transferverschlüsselung zu bewegen, müssen der passende SSL-Port aktiviert und Zertifikat und Schlüssel hinterlegt werden. Zusätzlich sollte der unverschlüsselte Zugriff untersagt werden.
Eine entsprechende Konfiguration (rabbitmq.conf) sieht wie folgt aus:
# ======================================
## Networking
## ====================
listeners.ssl.default = 5671
listeners.tcp = none
## TLS configuration.
## ====================
ssl_options.certfile = /etc/rabbitmq/rabbitmq-chain.pem
ssl_options.keyfile = /etc/rabbitmq/rabbitmq.key
ssl_options.verify = verify_peer
Im Vergleich dazu im älteren Erlang-Format (rabbitmq.config):
{ssl_listeners, [5671]},
{tcp_listeners, []},
{ssl_options, [
{certfile,"/etc/rabbitmq/rabbitmq-chain.pem"},
{keyfile,"/etc/rabbitmq/rabbitmq.key"},
{verify,verify_peer}
]}
]}].
Zertifikatsbasierte Authentifizierung (Zwei-Wege-SSL-Verbindung)
Um die Authentifizierung am RabbitMQ-Server anstatt mit Benutzername/Passwort mit einem X509-Zertifikat zu bewerkstelligen, muss auf Seiten der RabbitMQ sowohl das Plugin rabbitmq_auth_mechanism_ssl aktiviert, als auch die Konfiguration wie folgt ergänzt werden:
# ======================================
## Networking
## ====================
auth_mechanisms.1 = PLAIN
auth_mechanisms.3 = EXTERNAL
## TLS configuration.
## ====================
ssl_options.cacertfile = /etc/rabbitmq/cacert.pem
ssl_options.fail_if_no_peer_cert = false
ssl_cert_login_from = common_name
Im Vergleich dazu im älteren Erlang-Format (rabbitmq.config):
...
{auth_mechanisms, ['PLAIN','EXTERNAL']},
{ssl_options, [
...
{cacertfile,"/etc/rabbitmq/cacert.pem"},
{fail_if_no_peer_cert,false}
]},
{ssl_cert_login_from, common_name}
]}].
Die zu verwendende cacert.pem ergibt sich aus dem Schritt [Generierung Client-Zertifikat].
Generierung Client-Zertifikat
Da RabbitMQ sich sehr wählerisch in Bezug auf Client-Zertifikate verhält, sollte die offizielle Anleitung für die Generierung eines solchen herangezogen werden. Die erzeugte client/keycert.p12 findet dann Anwendung im Client, cacert.pem wird als serverseitiger TrustStore benötigt.
Generierung SecureConnector-TrustStore
Für den Aufbau einer verschlüsselten Verbindung zum RabbitMQ-Server benötigt der SecureConnector einen TrustStore im Java-Keystore-Format, der die Authentizität des Server-Zertifikats sicherstellt. Bei einem offiziellen Zertifikat einer Authentifizierungsstelle, kann als Basis die cacerts der verwendeten JRE herangezogen werden (jre/lib/security/cacerts, Standardpasswort: changeit). Dort muss in der Regel noch das Endzertifikat oder eine Chain-Datei des Zertifikats hinzugefügt werden:
Alternativ kann ein neuer Keystore angelegt werden, der die gesamte Server CA-Kette enthält, und dieser dem Fachverfahren als Trust-Store zur Verfügung gestellt werden.
Beispiel-Konfigurationen
Im Folgenden finden Sie mögliche Beispiel Konfigurationen, die Sie als Referenz heranziehen können.
RabbitMQ
# ======================================
## Networking
## ====================
auth_mechanisms.1 = PLAIN
auth_mechanisms.3 = EXTERNAL
listeners.ssl.default = 5671
listeners.tcp = none
## TLS configuration.
## ====================
ssl_options.cacertfile = /etc/rabbitmq/cacert.pem
ssl_options.certfile = /etc/rabbitmq/rabbitmq-chain.pem
ssl_options.keyfile = /etc/rabbitmq/rabbitmq.key
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = false
ssl_cert_login_from = common_name
Im Vergleich dazu im älteren Erlang-Format (rabbitmq.config):
{tcp_listeners, []},
{auth_mechanisms, ['PLAIN','EXTERNAL']},
{ssl_listeners, [5671]},
{ssl_options, [
{cacertfile,"/etc/rabbitmq/cacert.pem"},
{certfile,"/etc/rabbitmq/rabbitmq-chain.pem"},
{keyfile,"/etc/rabbitmq/rabbitmq.key"},
{verify,verify_peer},
{fail_if_no_peer_cert,false}
]},
{ssl_cert_login_from, common_name}
]}].
SecureConnector
Für die Zwei-Wege-SSLVerbindung des SecureConnectors muss das Rechenzentrum dem Fachverfahren einen TrustStore zur Verfügung stellen, wie er im Punkt [Generierung SecureConnector-TrustStore] beschrieben ist. Dieser muss dann, in Verbindung mit dem Client-Zertifikat, in die application.properties-Datei des Fachverfahrens integriert werden:
spring.rabbitmq.port=5671
spring.rabbitmq.ssl.enabled=true
spring.rabbitmq.ssl.key-store=file:/pfad/zum/keycert.p12
spring.rabbitmq.ssl.key-store-password=<keystore passwort>
spring.rabbitmq.ssl.trust-store=file:/pfad/zum/truststore
spring.rabbitmq.ssl.trust-store-password=<ttruststore passwort>
spring.rabbitmq.virtual-host=/12345678-1234
fs.messaging.queue=ikfz