springboot+rabbitmq+openssl

#一.openssl相关知识简介
#####1.对称加密和非对称加密
对称加密很好理解,就是用密码加密一个文件,解密时需要用相同的密码来解析;而非对称加密则是用一个密码加密,但是用与加密密码不同的密码解密。
#####2.公钥、私钥和签名、验证签名。
私钥和公钥都可以进行加密和解密。公钥加密数据,私钥解密数据的过程称为加密解密,公钥加密的数据只有它相应的私钥才能解开,所以将公钥分给其他人,让其把数据加密,该数据就只有到了有私钥的服务器这里才能解析出来,其他人得到了数据没有私钥也看不懂数据。而私钥加密、公钥解密的过程称之为签名和验证签名,如果服务器用客户端的私钥进行加密,有这个私钥的只有改服务器,那么客户端如果能将数据进行解析就说明这个数据是绑定的服务器发送的,相反,则不是,这就是签名和验证签名。
#####3.CA
什么是CA呢?正常情况下服务器会生成一个公钥文件,然后这个文件交给他人用于加密,这样用公钥加密然后再用私钥解密完成传输,但是有一些情况比如有人恶意破坏,将公钥文件替换成他的公钥文件,这种情况下就会造成数据泄露。为了解决这个问题就引入了CA,首先CA会将自己的公钥分发出去,发布公钥文件的服务器A(方便理解)将自己的公钥和自己的身份信息发给CA,CA拿到数据然后再用自己的私钥进行一次加密,也就是签名。这样这个包含A的公钥和身份信息的文件就被称为证书了。如此一来,A将该文件f(简称)发布后,假如B得到f文件然后把自己想要发给A的数据用f加密后发给A,A首先用CA的公钥进行签名验证(也就是用公钥验证私钥),然后再用自己的私钥进行解密,如此一来就进行了两次验证。显示情况下CA服务器大部分都会收费所以不得不搭建自己的证书服务器。
图解
#二.搭建openssl并签署证书

###1.下载openssl
地址:https://www.openssl.org
1.0.2版本
###2.上传服务器

scp /Users/xxxxxxxx/Downloads/openssl-1.0.2o.tar runhang@192.168.0.54:/home/xxxxx/

###3.解压

tar -xvf openssl-1.0.2o.tar 

###4.安装

./config shared --prefix=/usr/local/openssl
make
make install

####5.CA证书搭建
在这里我直接引用了github的一个项目可以快速生成证书:
地址:https://github.com/Berico-Technologies/CMF-AMQP-Configuration
首先,现在git上将项目拉下来

git clone https://github.com/Berico-Technologies/CMF-AMQP-Configuration.git  

进入CMF-AMQP-Configuration/ssl 目录
#####(1)建立认证机构 RabbitTest可以替换成自己想要的名字

sh setup_ca.sh RabbitTest 

####(2)生成服务器证书,192.168.2.55是服务器名,password是密码

sh make_server_cert.sh 192.168.2.55 password

####(3)生成客户端的证书 rabbit-client是客户端名称,password是密码

sh create_client_cert.sh rabbit-client password

以上三个命令会在ssl文件夹下生成三个文件夹:

  • ca
  • server
  • client
    #三.rabbitmq相关配置
    修改RabbitMQ的配置文件(该文件位于:/etc/rabbitmq/rabbitmq.config)
sudo vi /etc/rabbitmq/rabbitmq.config 
我将以上三个文件夹拷贝到了/etc/rabbitmq/ssl 

请一定修改下面文件的192.168.2.55名字

%% Disable SSLv3.0 and TLSv1.0 support.
[
    {ssl, [{versions, ['tlsv1.2', 'tlsv1.1']}]},
    {rabbit, [
        {tcp_listeners, [5672]},
        {ssl_listeners, [5671]},
        {ssl_options, [{cacertfile,"/etc/rabbitmq/ssl/ca/cacert.pem"},
            {certfile,"/etc/rabbitmq/ssl/server/192.168.2.55.cert.pem"},
            {keyfile,"/etc/rabbitmq/ssl/server/192.168.2.55.key.pem"},
            {verify, verify_peer},
            {fail_if_no_peer_cert, true},
            {versions, ['tlsv1.2', 'tlsv1.1']}
        ]}
    ]}
].

重启rabbitmq服务

service rabbitmq-server restart

#四.客户端操作
######1. 将生成的证书中server文件夹下的192.168.2.55.cert.pem和client文件夹下的runhang-client.keycert.p12拷贝到客户端,这里我将他们都放在了/Users/xxxx/文件夹下面。
######2.利用java的keytool将证书导入

keytool -import -alias 192.168.2.55.com -file /Users/xxxx/192.168.2.55.com.cert.pem -keystore /Users/xxxxxx/rabbitstore  

#五.springboot集成rabbitmq并且使用ssl
首先我的rabbitmq有一个hello队列
###1. 依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.gang</groupId>
    <artifactId>rabbitmqssl</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>rabbitmqssl</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

###2.配置

spring:
  rabbitmq:
    host: 192.168.2.55
    port: 5671
    username: name
    password: pass
    publisher-confirms: true
    ssl:
      enabled: true
      key-store: file:/Users/xxxx/rabbit-client.keycert.p12
      key-store-password: password
      trust-store: file:/Users/zhangjigang/rabbitstore
      trust-store-password: password

###3.Sender.java

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Sender {

    @Autowired
    private AmqpTemplate amqpTemplate;


    public void send(){
        String sendMsg="这是测试的啊";
        System.out.println("发送:"+sendMsg);
        amqpTemplate.convertAndSend("hello",sendMsg);
    }

}

###4Receiver.java

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = "hello")
public class Receiver {
    @RabbitHandler
    public void process(String hello){

        System.out.println("Receiver:"+hello);

    }
}

###5.controller

import com.gang.rabbitmqssl.Utils.Sender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RabbitController {


    @Autowired
    Sender sender;

    @GetMapping("test")
    public String test(){
        sender.send();
        return "success";
    }
}

###6.运行
用postman请求:
结果

博客参考:
http://vstars.iteye.com/blog/2229409
https://blog.csdn.net/oldmtn/article/details/52208747

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值