ToB企服应用市场:ToB评测及商务社交产业平台

标题: RabbitMQ开启TLS支持,办理AMQP明文身份验证弊端 [打印本页]

作者: 徐锦洪    时间: 2024-7-29 16:48
标题: RabbitMQ开启TLS支持,办理AMQP明文身份验证弊端
随着网络通信安全性的日益紧张,我们不难发现,在企业级应用中,数据传输的安全防护步伐已经成为不可或缺的一环。近期,不少使用RabbitMQ的开发团队收到了关于“远程主机答应明文身份验证”的弊端告诫。为确保敏感信息的安全传递,启用TLS(Transport Layer Security)支持成为了关键的办理方案。本文将详细介绍如何在RabbitMQ中启用TLS加密,以及在SpringBoot应用中配置TLS并设置EXTERNAL认证,通过实际操作步骤办理明文身份验证弊端。

一、启用RabbitMQ的TLS支持
1. 使用OpenSSL天生服务端证书
  1. # 创建自签名CA证书,执行命令后根据提示设置CA私钥加密密码,并填写国家、地区等信息
  2. openssl req -x509 -newkey rsa:4096 -sha512 -days 3650 -out ca_cert.pem -keyout ca_key.pem
  3. # 生成RabbitMQ服务器私钥,执行命令后根据提示设置服务器私钥加密密码
  4. openssl genpkey -algorithm RSA -out rabbit_server_key.pem -aes256
  5. # 创建证书签名请求CSR,执行命令后根据提示输入上述服务器私钥加密密码
  6. openssl req -new -key rabbit_server_key.pem -out rabbit_server.csr
  7. # 使用之前创建的CA证书来签署服务器的CSR以生成服务器证书
  8. openssl x509 -req -in rabbit_server.csr -CA ca_cert.pem -CAkey ca_key.pem -CAcreateserial -out rabbit_server_cert.pem -days 3650 -sha512
复制代码
上述下令产生以下证书/私钥文件:
ca_cert.pem:CA证书文件。
ca_key.pem:CA私钥文件。
rabbit_server_cert.pem:RabbitMQ服务器证书文件。
rabbit_server_key.pem:RabbitMQ服务器私钥文件。
产生的以下中间文件可删除:
rabbit_server.csr、ca_cert.srl
2. 配置RabbitMQ启用TLS
将天生的证书/私钥文件放置到RabbitMQ配置目录下(比如:/etc/rabbitmq/ssl),然后在rabbitmq.conf文件中添加SSL相关配置:
  1. listeners.ssl.default = 5671
  2. auth_mechanisms.1 = EXTERNAL
  3. ssl_options.cacertfile = /etc/rabbitmq/ssl/ca_cert.pem
  4. ssl_options.certfile = /etc/rabbitmq/ssl/rabbit_server_cert.pem
  5. ssl_options.keyfile = /etc/rabbitmq/ssl/rabbit_server_key.pem
  6. ssl_options.password = #服务器私钥加密密码
  7. ssl_options.verify = verify_peer
  8. ssl_options.fail_if_no_peer_cert = true
  9. ssl_cert_login_from = common_name
复制代码
可以完全禁用通例(非TLS)监听,只有启用TLS的客户端使用正确的端口才气连接,添加以下配置:
  1. # disables non-TLS listeners, only TLS-enabled clients will be able to connect
  2. listeners.tcp = none
复制代码
如果RabbitMQ配置文件使用经典配置格式,可以如许设置TLS配置:
  1. [
  2.   {rabbit, [
  3.     {ssl_listeners, [5671]},
  4.     {ssl_options, [
  5.       {cacertfile, "/etc/rabbitmq/ssl/ca_cert.pem"},
  6.       {certfile, "/etc/rabbitmq/ssl/rabbit_server_cert.pem"},
  7.       {keyfile, "/etc/rabbitmq/ssl/rabbit_server_key.pem"},
  8.       {verify, verify_peer},
  9.       {fail_if_no_peer_cert, true}
  10.     ]},
  11.     {auth_mechanisms, ['EXTERNAL']},
  12.     {ssl_cert_login_from, common_name}
  13.   ]}
  14. ].
复制代码
配置分析:
ssl_listeners:SSL协议端口。
cacertfile:CA证书路径。
certfile:服务器公钥路径。
keyfile:服务器私钥路径。
verify:verify_peer-使用对等验证,客户端与服务端交换证书并验证;verify_none-禁用对等验证,并且不会实验证书交换。
fail_if_no_peer_cert:true-不继承没证书的客户端连接;false-继承没证书的客户端连接。
auth_mechanisms:认证机制,EXTERNAL-使用插件提供认证功能;PLAIN-SASL PLAIN验证。在RabbitMQ服务器和客户端
ssl_cert_login_from:使用证书中的common_name(即CN)作为登录用户名(见下文创建客户端证书部门)。
为确保私钥文件的安全,产生的私钥文件默认仅属主用户可读写。必要查抄文件权限,确保RabbitMQ运行用户可读,避免启动RabbitMQ服务时报错:ssl_options.keyfile invalid, file does not exist or cannot be read by the node.

二、客户端使用使用TLS连接
1. 使用OpenSSL天生客户端证书
  1. # 创建客户端私钥,执行命令后根据提示设置私钥加密密码
  2. openssl genpkey -algorithm RSA -out rabbit_client.key -aes256
  3. # 从私钥创建证书签名请求CSR,执行命令后根据提示输入上述私钥密码
  4. # 根据服务端ssl_cert_login_from的配置,CN=admin将使用admin作为登录RabbitMQ的用户名
  5. openssl req -new -key rabbit_client.key -out rabbit_client.csr -subj "/CN=admin/O=Your Organization Name/C=CN"
  6. # 使用自签名CA证书和服务器私钥生成客户端证书(将rabbit_client.csr文件上传到RabbitMQ服务器执行)
  7. openssl x509 -req -in rabbit_client.csr -CA ca_cert.pem -CAkey ca_key.pem -CAcreateserial -out rabbit_client.crt -days 3650 -sha512
  8. # 使用客户端证书创建客户端PKCS12格式的KeyStore,执行命令后,根据提示先输入客户端私钥密码,再设置KeyStore密码
  9. openssl pkcs12 -export -in rabbit_client.crt -inkey rabbit_client.key -out rabbit_client.p12 -CAfile ca_cert.pem -name rabbit_client -caname rabbit_root_ca
  10. # 将CA证书添加到TrustStore,以信任该CA证书,执行命令后,根据提示先设置TrustStore密码,再输入yes信任这个CA证书
  11. keytool -importcert -alias rabbit_root_ca -keystore rabbit_truststore.jks -file ca_cert.pem
复制代码
上述下令产生以下证书/私钥文件:
rabbit_client.p12:客户端PKCS12格式的KeyStore,用于存储客户端证书与私钥。
rabbit_truststore.jks:客户端TrustStore文件,存放信任的CA证书。
产生的以下中间文件可删除:
rabbit_client.key、rabbit_client.csr、rabbit_client.crt
2. 应用配置
将天生的KeyStore和Truststore文件放置到应用配置目录下(如:resources/ssl),然后在应用配置文件中举行TLS相关配置:
  1. spring:
  2.   rabbitmq:
  3.     addresses: server:5671
  4.     ssl:
  5.       enabled: true
  6.       key-store: classpath:ssl/rabbit_client.p12
  7.       key-store-password: #KeyStore密码
  8.       trust-store: classpath:ssl/rabbit_truststore.jks
  9.       verify-hostname: false
复制代码
3. 应用设置EXTERNAL认证机制
  1. @Configuration
  2. @ConditionalOnProperty(name = "spring.rabbitmq.ssl.enabled", havingValue = "true")
  3. public class RabbitmqSslConfig {
  4.     @Autowired
  5.     CachingConnectionFactory cachingConnectionFactory;
  6.     /**
  7.      * 解决安全扫描AMQP明文登录漏洞,显式设置EXTERNAL认证机制
  8.      * EXTERNAL认证机制使用X509认证方式,服务端读取客户端证书中的CN作为登录名称
  9.      */
  10.     @PostConstruct
  11.     public void rabbitmqSaslExternal() {
  12.         cachingConnectionFactory.getRabbitConnectionFactory().setSaslConfig(DefaultSaslConfig.EXTERNAL);
  13.     }
  14. }
复制代码
通过上述步骤,我们乐成实现了在RabbitMQ中启用TLS加密,从而有用地办理了明文身份验证带来的安全隐患。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4