SpringBoot+RabbitMQ+SSL/TLS整合与部署
( 简单的安装和使用springboot整合MQ都是很简单,但是整合SSL的时候就很小白了,都是一点点查阅了解得到的部署流程.文章比较适合小白使用 )
安装RabbitMQ(使用安装包或docker安装)
方案一:安装包安装MQ(Centos7X)
安装依赖文件
yum -y install gcc glibc-devel make ncurses-devel openssl-devel xmlto perl wget
安装erlang环境(版本18.3)
下载erlang包
//下载erlang包
可以选择直接下载,但是超级慢,可以本地网盘下载
手动下载地址: 链接:https://pan.baidu.com/s/14IiVo7PL9MWM8b7SBSn70A
提取码:60se
不嫌弃慢可以直接下载:
wget http://www.erlang.org/download/otp_src_18.3.tar.gz //下载erlang包
下载好后
tar -xzvf otp_src_18.3.tar.gz //解压
cd otp_src_18.3/ //切换到安装路径
./configure --prefix=/usr/local/erlang //生产安装配置
make && make install //编译安装
配置erlang环境变量
vi /etc/profile //在底部添加以下内容
#set erlang environment
ERL_HOME=/usr/local/erlang
PATH=$ERL_HOME/bin:$PATH
export ERL_HOME PATH
source /etc/profile //生效
测试一下是否安装成功
erl //如果进入erlang,则证明安装成功
退出连续两次
Ctrl+C
安装RabbitMQ(版本3.6.1)
下载安装
cd /usr/local //切换到计划安装RabbitMQ的目录,我这里放在/usr/local
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.1/rabbitmq-server-generic-unix-3.6.1.tar.xz //下载RabbitMQ安装包
xz -d rabbitmq-server-generic-unix-3.6.1.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.6.1.tar
// 解压后多了个文件夹rabbitmq-server-3.6.1 ,重命名为rabbitmq以便记忆。
mv rabbitmq_server-3.6.1/ rabbitmq
配置rabbitmq环境变量
vi /etc/profile
#set rabbitmq environment
export PATH=$PATH:/usr/local/rabbitmq/sbin
source /etc/profile
启动服务
rabbitmq-server -detached //启动rabbitmq,-detached代表后台守护进程方式启动。
查看状态
rabbitmqctl status
如果现实running,安装成功
其他相关命令
启动服务:rabbitmq-server -detached
查看状态:rabbitmqctl status
关闭服务:rabbitmqctl stop
列出角色:rabbitmqctl list_users
配置网页插件
首先创建目录,否则可能报错
mkdir /etc/rabbitmq
然后启用插件
rabbitmq-plugins enable rabbitmq_management
配置防火墙
配置linux 端口 15672 网页管理 5672 AMQP端口
注:这里需要添加tls监听的端口5671,所以一起添加了
firewall-cmd --permanent --add-port=15672/tcp
firewall-cmd --permanent --add-port=5672/tcp
firewall-cmd --permanent --add-port=5671/tcp
systemctl restart firewalld.service
现在你在浏览器中输入服务器IP:15672 就可以看到RabbitMQ的WEB管理页面了,是不是很兴奋,可是你没有账号密码,别急。
配置账号密码和权限
guest用户只能在本地访问的,需要增加一个用户修改一下权限,代码如下:
rabbitmqctl add_user maxton maxton //添加用户,后面两个参数分别是用户名和密码,我这都用superrd了。
rabbitmqctl set_permissions -p / maxton ".*" ".*" ".*" //添加权限
rabbitmqctl set_user_tags maxton administrator //修改用户角色
然后就可以远程访问了,然后可直接配置用户权限等信息。 登录:http://ip:15672 登录之后在admin里面把guest删除。
走到这一步,恭喜,你的RabbitMQ安装好了!!!
方案二:使用docker安装MQ(Centos7X)
注: 网上使用docker安装rabbitMQ很多,这里主要是使用docker安装RabbitMQ集群
首先有docker的环境,安装docker就不描述了
下载docker镜像
// 进入docker hub镜像仓库地址:https://hub.docker.com/
// 搜索rabbitMq,可以看到几种类型的镜像;我们选择带有“mangement”的版本(包含web管理页面)
// 下载镜像
docker pull rabbitmq:3-management
启动容器,集群配置
// 注意其中的hostname/name命名,rabbitcookie和用户密码
// 如果使用SSL,那么监听的是5671,要在run的时候增加, -p 5671:5671
// 如果想更改端口,比如用8888来替换5672,修改-p 5672:5672为-p 8888:5672即可
节点1:
docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3-management
节点2:
docker run -d --hostname rabbit2 --name myrabbit2 -p 5673:5672 --link myrabbit1:rabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3-management
节点3:
docker run -d --hostname rabbit3 --name myrabbit3 -p 5674:5672 --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3-management
... ...
// 紧接着配置容器,配置相同Erlang Cookie
docker exec -it myrabbit1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
docker exec -it myrabbit2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit1
rabbitmqctl start_app
exit
docker exec -it myrabbit3 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbit1
rabbitmqctl start_app
exit
登录界面查看
现在你在浏览器中输入服务器IP:15672 输入配置的账号密码,可以看到WEB界面中有配置的节点信息,有关节点中配置磁盘存储,端口映射问题等信息,自行百度.
(图片:如上图)
springboot整合测试(简单)
不详细写了,这都简单,详细的是TLS/SSL部分
配置文件
spring.rabbitmq.host=192.168.21.xxx
spring.rabbitmq.port=5672
spring.rabbitmq.username=maxton
spring.rabbitmq.password=maxton
spring.rabbitmq.virtual-host=/
发送消息
@Test
public void contextLoads() {
String str = "Hello Maxton";
rabbitTemplate.convertAndSend("exchange.direct", "atguigu.news", str);
}
接收消息
@Test
public void receive() {
Object o = rabbitTemplate.receiveAndConvert("atguigu.news");
System.out.println(o.getClass());
System.out.println(o);
}
生成证书文件
官方文档
// 官方文档地址,根据tls-gen生成
https://www.rabbitmq.com/ssl.html#automated-certificate-generation
方案二
// 还有一种生成证书文件的脚本,流程差不多,官方文档是tls-gen,所以按照官网推荐的来
https://github.com/Berico-Technologies/CMF-AMQP-Configuration
环境安装
使用tls-gen生成证书,需要在Linux或MacOS 系统中
这里我们使用Linux,centos7X,openssl和Python3.5+的环境
openssl
一般Linux自带有OpenSSL,如果没有,百度安装即可
// 查看是都有OpenSSL
openssl version
Python3.5+
我的Linux是2.7版本,需要升级一下
// 查看版本
python -V
安装流程
// linux如果已经安装了python2.* 不要管它!!!
// 安装依赖环境,一定要使用yum去安装,因为有的包有依赖或者升级需要,使用rpm取消强制依赖安装会报错的!
// 执行yum
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
// 下载python 3.5.1
// 放置路径
mkdir -p /usr/local/python3
// 可以使用wget 直接下载 :wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
// 也可以官网下载传到Linux,官网-下载地址 https://www.python.org/downloads/release/python-351/
解压 安装
tar -zxvf Python-3.5.1.tgz
cd Python-3.5.1
./configure --prefix=/usr/local/python3(路径)
make
make install
建立软连接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3(路径)
修改PATH
vim ~/.bash_profile
// 添加
PATH=$PATH:$HOME/bin:/usr/local/python3/bin(路径)
// 然后更新PATH
source ~/.bash_profile
检查安装是否完成
python3 -V
pip3 -V
用tls-gen生成证书
下载tls-gen
git路径: https://github.com/michaelklishin/tls-gen
从git上直接下载到本地,如果Linux中有git,可以直接下载,下载时注意路径
// 新建一个自己的路径
mkdir maxton
cd maxton
// 直接克隆
git clone https://github.com/michaelklishin/tls-gen tls-gen
cd tls-gen/basic
# private key password
make PASSWORD=bunnies
make verify
make info
ls -l ./result
设置过期时间(默认是10年3650天)
// 生成后如果想更改,执行下面命令修改过期时间
make PASSWORD=ST-dtw_client.1983 DAYS_OF_VALIDITY=7300 // 20年
证书已经生成,路径
cd ~
cd /maxton/tls-gen/basic/result/
我们使用的是JAVA,使用keytool工具生成rabbitstore
keytool -import -alias server1 -file /path/to/server_certificate.pem -keystore /path/to/rabbitstore
// 其中/path/to,就是result的全路径,本文是/root/maxton/tls-gen/basic/result/
// 执行时会让输入密码:记住store的密码
// 输入yes
此时result路径下有一下文件
ca_certificate.pem
ca_key.pem
client_certificate.pem
client_key.p12
client_key.pem
rabbitstore
server_certificate.pem
server_key.p12
server_key.pem
能用到的文件
// 服务器端
ca_certificate.pem
server_certificate.pem
server_key.pem
// 客户端
client_key.p12 // 密码为输入make PASSWORD=bunnies时的密码
rabbitstore // 密码为执行keytool时输入的密码
到这一步,证书已经生成好了。下面配置rabbitMQ吧。
(这里主要将如何替换掉docker中的文件,变为监听5671端口,知道这个,安装包安装的更简单了)
配置RabbitMQ
配置rabbitmq.conf文件
查看docker中文件
docker ps // 查看容器是否在运行中
// 查看rabbitMQ的镜像ID或名称
// 进入容器
docker exec -it rabbitName bash
// 查看rabbitmq.conf文件
cd /etc/rabbitmq/
ls
// 查看是否有rabbitmq.conf文件,没有touch rabbitmq.conf 创建一个
pwd // 记住路径地址
exit
// 退出
复制文件(容器到本地)
// 从docker容器中把文件复制出来
docker cp rabbitName:/etc/rabbitmq/rabbitmq.conf /root/maxton/
复制CA证书到容器
// 将本地证书文件,复制到容器中,对应的路径与配置文件中rabbitmq.conf一直
docker cp /root/maxton/tls-gen/basic/result/ca_certificate.pem myrabbit1:/etc/rabbitmq/ssl/
docker cp /root/maxton/tls-gen/basic/result/server_certificate.pem myrabbit1:/etc/rabbitmq/ssl/
docker cp /root/maxton/tls-gen/basic/result/server_key.pem myrabbit1:/etc/rabbitmq/ssl/
配置文件
vi /root/maxton/rabbitmq.conf
方式一:
[
{rabbit, [
{tcp_listeners, [5672]},
{ssl_listeners, [5671]},
{ssl_options, [{cacertfile,"/usr/local/rabbitmq/ssl/ca_certificate.pem"},
{certfile,"/usr/local/rabbitmq/ssl/server_certificate.pem"},
{keyfile,"/usr/local/rabbitmq/ssl/server_key.pem"},
{verify, verify_peer},
{fail_if_no_peer_cert, true}
]}
]}
].
方式二:
#listeners.tcp.default = 127.0.0.1:5672 // 一般开通后不监听5672端口,可以注释掉
listeners.ssl.default = 5671
ssl_options.cacertfile = /usr/local/rabbitmq/ssl/ca_certificate.pem
ssl_options.certfile = /usr/local/rabbitmq/ssl/server_certificate.pem
ssl_options.keyfile = /usr/local/rabbitmq/ssl/server_key.pem
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = true
具体的就不解释内容是啥了,官网都有
复制文件(本地到容器)
// 将本地文件复制到容器
docker cp /root/maxton/rabbitmq.conf rabbitName:/etc/rabbitmq/
重启容器
// 每个MQ容器都重启
docker restart rabbitName
登录WEB界面查看
现在你在浏览器中输入服务器IP:15672
首页看到在Ports and contexts–Listening ports中是否有
到这一步,rabbitMQ服务器端已经配置好了
配置客户端,需要将下面两个文件拷贝到客户端
// 路径
cd /root/maxton/tls-gen/basic/result/
// 客户端
client_key.p12 // 密码为输入make PASSWORD=bunnies时的密码
rabbitstore // 密码为执行keytool时输入的密码
springboot整合SSL测试
配置文件
主要就是配置文件,这里配置好了,其他的都一样
配置文件
# spring.rabbitmq.addresses=192.168.21.xx:5672,192.168.21.xx:5673,192.168.21.xx:5674 //集群
spring.rabbitmq.host=192.168.21.xx
spring.rabbitmq.port=5671
spring.rabbitmq.username=maxton
spring.rabbitmq.password=maxton
spring.rabbitmq.virtual-host=/
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.ssl.enabled=true
spring.rabbitmq.ssl.key-store=rabbitMQ/client_key.p12
spring.rabbitmq.ssl.key-store-password=maxton
spring.rabbitmq.ssl.trust-store=rabbitMQ/rabbitstore
spring.rabbitmq.ssl.trust-store-password=maxtonStore
spring.rabbitmq.ssl.algorithm=TLSv1.2
spring.rabbitmq.ssl.trust-store-type=JKS
spring.rabbitmq.ssl.key-store-type=PKCS12
spring.rabbitmq.ssl.validate-server-certificate=true
spring.rabbitmq.ssl.verify-hostname=false
解释说明
spring.rabbitmq.port=5671 // 注意端口修改为5671
spring.rabbitmq.ssl.key-store=rabbitMQ/client_key.p12 // 路径为resources的路径
spring.rabbitmq.ssl.key-store-password=maxton // 密码为执行tls-gen的密码
spring.rabbitmq.ssl.trust-store-password=maxtonStore // 密码为执行keytool时输入的密码
spring.rabbitmq.ssl.verify-hostname=false // 一定要改为false,否则连接报错
爬坑记录
坑一:官方文档
有一处需要注释,否则连接错误
public static void main(String[] args) throws Exception {
char[] keyPassphrase = "maxton".toCharArray();
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream("E:\\client_key.p12"), keyPassphrase);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, keyPassphrase);
char[] trustPassphrase = "maxtonStore".toCharArray();
KeyStore tks = KeyStore.getInstance("JKS");
tks.load(new FileInputStream("E:\\rabbitstore"), trustPassphrase);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(tks);
SSLContext c = SSLContext.getInstance("TLSv1.2");
c.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.21.xx");
factory.setPort(5671);
factory.setUsername("maxton");
factory.setPassword("maxton");
factory.useSslProtocol(c);
// factory.enableHostnameVerification();
Connection conn = factory.newConnection();
Channel channel = conn.createChannel();
channel.queueDeclare("rabbitmq-java-test", false, true, true, null);
channel.basicPublish("", "rabbitmq-java-test", null, "Hello, World".getBytes());
GetResponse chResponse = channel.basicGet("rabbitmq-java-test", false);
if (chResponse == null) {
System.out.println("No message retrieved");
} else {
byte[] body = chResponse.getBody();
System.out.println("Received: " + new String(body));
}
channel.close();
conn.close();
}
就是这factory.enableHostnameVerification();需要注释
开始跟着网站找的一些和官方文档,遇到的超多的坑,大部分都是账号密码不对,环境不对,配置文件不对等问题.以上都基本列出来了.亲测可以.
如有问题,可联系一起探讨解决:QQ 582928028
其他坑等你们发现了~~~