我将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上动态创建用户,这似乎是不可能的。
有人知道我是否可以进行动态用户创建吗?或建议其他方法来解决我的身份验证问题?
谢谢
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中创建用户>
我认为,如果您保护生成的密钥,以便只有代理可以访问它们,这是非常安全的设置。