2015-11-26 10:07:53 +08:00
|
|
|
# x509 (TLS/SSL) certificate Authentication Mechanism for RabbitMQ
|
|
|
|
|
2017-06-10 01:24:46 +08:00
|
|
|
This plugin allows RabbitMQ clients authenticate using x509 certificates
|
|
|
|
and TLS (PKI) [peer verification mechanism](https://tools.ietf.org/html/rfc5280#section-6)
|
|
|
|
instead of credentials (username/password pairs).
|
2011-01-10 20:34:52 +08:00
|
|
|
|
2017-06-10 01:24:46 +08:00
|
|
|
|
|
|
|
## How it Works
|
|
|
|
|
|
|
|
When a client connects and performs TLS upgrade,
|
|
|
|
the username is obtained from the client's
|
|
|
|
TLS (x509) certificate. The user's password is not checked.
|
|
|
|
|
|
|
|
In order to use this mechanism the client must connect with TLS enabled, and
|
2011-01-10 20:34:52 +08:00
|
|
|
present a client certificate.
|
|
|
|
|
2017-06-10 01:24:46 +08:00
|
|
|
|
|
|
|
## Usage
|
|
|
|
|
|
|
|
This mechanism must also be enabled in RabbitMQ's configuration file,
|
2024-08-16 04:04:41 +08:00
|
|
|
see [Authentication Mechanisms](https://www.rabbitmq.com/docs/access-control/) and
|
2024-11-27 07:17:15 +08:00
|
|
|
[Configuration](https://www.rabbitmq.com/docs/configure) guides for
|
2017-06-10 01:24:46 +08:00
|
|
|
more details.
|
|
|
|
|
|
|
|
A couple of examples:
|
2013-02-06 22:54:16 +08:00
|
|
|
|
2020-07-12 21:52:06 +08:00
|
|
|
``` ini
|
|
|
|
auth_mechanisms.1 = PLAIN
|
2024-03-01 23:33:36 +08:00
|
|
|
auth_mechanisms.2 = AMQPLAIN
|
|
|
|
auth_mechanisms.3 = EXTERNAL
|
2015-11-26 10:07:53 +08:00
|
|
|
```
|
2013-02-06 22:54:16 +08:00
|
|
|
|
|
|
|
to allow this mechanism in addition to the defaults, or:
|
|
|
|
|
2020-07-12 21:52:06 +08:00
|
|
|
``` ini
|
|
|
|
auth_mechanisms.1 = EXTERNAL
|
2015-11-26 10:07:53 +08:00
|
|
|
```
|
2013-02-06 22:54:16 +08:00
|
|
|
|
2017-06-10 01:24:46 +08:00
|
|
|
to allow only this mechanism and prohibit connections that use
|
|
|
|
username and passwords.
|
2013-02-06 22:54:16 +08:00
|
|
|
|
2014-06-03 19:30:47 +08:00
|
|
|
For safety the server must be configured with the SSL option 'verify'
|
|
|
|
set to 'verify_peer', to ensure that if an SSL client presents a
|
|
|
|
certificate, it gets verified.
|
2011-01-10 20:34:52 +08:00
|
|
|
|
2024-11-27 07:17:15 +08:00
|
|
|
### On Certificate Formats and Generation
|
|
|
|
|
|
|
|
RabbitMQ uses certificates and private keys in the PEM format. How they are generated
|
|
|
|
is entirely up to the cluster operator. They can be obtained from a well-known and trusted
|
|
|
|
commercial certificate authority or generated as "self-signed" (the CA will be project-specific
|
|
|
|
and will not be widely trusted).
|
|
|
|
|
|
|
|
[`tls-gen`](https://github.com/rabbitmq/tls-gen) is a tool that can generate self-signed certificate chains:
|
|
|
|
a CA, a CA certificate, zero or more intermediate certificates and a client or server (leaf) certificate.
|
|
|
|
|
|
|
|
Some of the examples below will use `openssl` CLI tools directly because of their widespread use.
|
|
|
|
However, this plugin will work just fine with any x.509 standards compliant certificate in the PEM format,
|
|
|
|
regardless of what tool has generated them.
|
|
|
|
|
|
|
|
|
2017-06-10 01:24:46 +08:00
|
|
|
### Username Extraction from Certificate
|
|
|
|
|
|
|
|
#### Distinguished Name
|
|
|
|
|
|
|
|
By default this will set the username to an [RFC 4514](https://tools.ietf.org/html/rfc4514)-ish string form of
|
2012-01-16 19:21:17 +08:00
|
|
|
the certificate's subject's Distinguished Name, similar to that
|
2017-06-10 01:24:46 +08:00
|
|
|
produced by OpenSSL's "-nameopt [RFC 2253"](https://tools.ietf.org/html/rfc2253) option.
|
2012-01-16 19:21:17 +08:00
|
|
|
|
|
|
|
You can obtain this string form from a certificate with a command like:
|
|
|
|
|
2015-11-26 10:07:53 +08:00
|
|
|
```
|
2024-11-27 06:18:17 +08:00
|
|
|
openssl x509 -nameopt RFC2253 -subject -noout -in path/to/cert.pem
|
2015-11-26 10:07:53 +08:00
|
|
|
```
|
2012-01-16 19:21:17 +08:00
|
|
|
|
|
|
|
or from an existing amqps connection with commands like:
|
|
|
|
|
2020-07-12 21:52:06 +08:00
|
|
|
``` bash
|
2015-11-26 10:07:53 +08:00
|
|
|
rabbitmqctl list_connections peer_cert_subject
|
|
|
|
```
|
2012-01-16 19:21:17 +08:00
|
|
|
|
2021-03-23 23:53:26 +08:00
|
|
|
#### Subject Alternative Name
|
|
|
|
|
|
|
|
To extract username from a Subject Alternative Name (SAN) field, a few
|
|
|
|
settings need to be configured. Since a certificate can have more than
|
|
|
|
one SAN field and they can represent identities of different types,
|
|
|
|
the type and the index of the field to use must be provided.
|
|
|
|
|
|
|
|
For example, to use the first SAN value of type DNS:
|
|
|
|
|
|
|
|
``` ini
|
|
|
|
auth_mechanisms.1 = EXTERNAL
|
|
|
|
|
2021-04-19 06:03:57 +08:00
|
|
|
ssl_cert_login_from = subject_alternative_name
|
|
|
|
ssl_cert_login_san_type = dns
|
|
|
|
ssl_cert_login_san_index = 0
|
|
|
|
```
|
|
|
|
|
|
|
|
Or of type email:
|
|
|
|
|
|
|
|
``` ini
|
|
|
|
auth_mechanisms.1 = EXTERNAL
|
|
|
|
|
2021-03-23 23:53:26 +08:00
|
|
|
ssl_cert_login_from = subject_alternative_name
|
|
|
|
ssl_cert_login_san_type = email
|
|
|
|
ssl_cert_login_san_index = 0
|
|
|
|
```
|
|
|
|
|
2017-06-10 01:24:46 +08:00
|
|
|
#### Common Name
|
|
|
|
|
|
|
|
To use the Common Name instead, set `rabbit.ssl_cert_login_from` to `common_name`:
|
2012-01-06 21:01:23 +08:00
|
|
|
|
2020-07-12 21:52:06 +08:00
|
|
|
``` ini
|
|
|
|
auth_mechanisms.1 = EXTERNAL
|
|
|
|
|
|
|
|
ssl_cert_login_from = common_name
|
2015-11-26 10:07:53 +08:00
|
|
|
```
|
2012-01-06 21:01:23 +08:00
|
|
|
|
2011-01-10 20:34:52 +08:00
|
|
|
Note that the authenticated user will then be looked up in the
|
2024-11-27 07:17:15 +08:00
|
|
|
[configured authentication / authorisation backend(s)](https://www.rabbitmq.com/docs/access-control). This will be
|
2017-06-10 01:24:46 +08:00
|
|
|
the internal node database by default but could include other
|
2013-07-01 17:49:11 +08:00
|
|
|
backends if so configured.
|
2015-11-26 10:07:53 +08:00
|
|
|
|
|
|
|
## Copyright & License
|
|
|
|
|
2024-11-27 07:17:15 +08:00
|
|
|
(c) 2007-2024 Broadcom. All Rights Reserved. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
|
2015-11-26 10:07:53 +08:00
|
|
|
|
|
|
|
Released under the same license as RabbitMQ.
|