SpringBoot+rabbitMQ+TLS/SLL整合安装部署

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删除。
SpringBoot+rabbitMQ+TLS/SLL整合安装部署_第1张图片

走到这一步,恭喜,你的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中是否有
SpringBoot+rabbitMQ+TLS/SLL整合安装部署_第2张图片

到这一步,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

其他坑等你们发现了~~~

你可能感兴趣的:(docker,java,centos)