#一.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
###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