我正在将RabbitMQ与SSL / TLS结合使用,以实现机密性,完整性和身份验证。发送的消息使用发送者和代理之间的发送者和代理证书进行加密,然后使用代理和接收者之间的代理和接收者证书进行加密。
我的配置文件如下:
{ssl, [{versions, ['tlsv1.2']}]},
{rabbit, [
{ssl_listeners, [5671]},
{ssl_options, [{cacertfile, "...ca_certificate.pem"},
{certfile, "...certificate_signed.pem"},
{keyfile, "...private_key.pem"},
{password, "pass"},
{verify, verify_peer},
{fail_if_no_peer_cert, true},
{versions, ['tlsv1.2']}]}
]}
但这还不够,因为我需要接收者/消费者能够确保发送者/发布者的身份,如here中所述。在接收方,我只能访问代理证书中的证书信息。
一种解决方案是使用 user-id 消息属性,就像我在documentation中找到的那样。 在每条消息中发送的该属性将确保仅当user-id属性等于该用户登录RabbitMQ代理所使用的用户名时,消息才能成功发布。由于我已经在使用SSL证书,因此我可能还会使用它们作为代理对用户进行身份验证,如here
我的问题:
我正在使用RabbitMQ在模拟平台中的代理之间进行通信,并且代理是动态创建的,因此我似乎需要在RabbitMQ上动态创建用户,这似乎是不可能的。
有人知道我是否可以进行动态用户创建吗?还是建议解决我的身份验证问题的另一种方法?
谢谢
答案 0 :(得分:0)
user-id属性不是安全功能。它只是在消息标题中设置信息,以便您知道是谁产生了消息。
如果要使用证书进行身份验证和授权,可以遵循链接的文章(https://weblogs.asp.net/jeffreyabecker/Using-SSL-client-certificates-for-authentication-with-RabbitMQ)中的指令,尤其是在“通过证书配置客户端身份验证”部分中。
简而言之,您需要安装rabbitmq-auth-mecanism-ssl插件(请参见https://github.com/rabbitmq/rabbitmq-auth-mechanism-ssl/blob/master/README.md)并根据文档进行配置。您还需要在RabbitMQ中创建一个无密码的内部用户,该用户具有与证书相同的CN(通用名称),以便能够对其进行授权。
如果您希望所有事情都自动化(应该如此),则每次创建新代理时,都必须:
使用openssl生成客户端密钥/证书对(请参见:https://superuser.com/questions/226192/avoid-password-prompt-for-keys-and-prompts-for-dn-information)。您的密钥需要由RabbitMQ信任的同一证书颁发机构信任(在您的SSL设置中)。
使用Rabbitmqctl(https://www.rabbitmq.com/management.html)在RabbitMQ中创建用户
在我看来,如果您保护生成的密钥,以便只有代理可以访问它们,这是一个非常安全的设置。