安裝配置RabbitMQ(啟動SSL)及測驗案例
- 一. RabbitMQ依賴環境及其安裝
- 1. 在Ubuntu中下載安裝SSL
- 2. 在ubuntu中安裝RabbitMQ服務
- 2.1 下載安裝Erlang
- 2.2 下載安裝RabbitMQ服務
- 二. RabbitMQ服務配置
- 1. 開啟RabbitMQ web端管理界面
- 2. 配置監聽支持SSL的埠
- 2.1 生成證書
- 2.2 修改RabbitMQ的組態檔(開啟SSL)
- 三. 簡單測驗RabbitMQ(支持SSL)是否配置成功
- 1. 驗證RabbitMQ服務端是否配置成功
- 2. 使用rabbitmq-c的第三方庫作為客戶端連接RabbitMQ broker
一. RabbitMQ依賴環境及其安裝
1. 在Ubuntu中下載安裝SSL
下載并安裝OpenSSL
sudo apt-get install openssl
安裝完之后可查看安裝版本情況
openssl version
2. 在ubuntu中安裝RabbitMQ服務
2.1 下載安裝Erlang
由于安裝RabbitMQ需要Erlang環境支持,所以執行命令
sudo apt-get install erlang
安裝完畢之后可查看安裝情況
erl
2.2 下載安裝RabbitMQ服務
sudo apt-get install rabbitmq-server
安裝完后啟動服務
sudo service rabbitmq-server start
查看服務狀態
service rabbitmq-server status

二. RabbitMQ服務配置
1. 開啟RabbitMQ web端管理界面
如果想要開啟RabbitMQ的 web端管理界面執行如下命令:
/sbin/rabbitmq-plugins enable rabbitmq_management
安裝插件完后需要重啟RabbitMQ服務
service rabbitmq-server restart
在游覽器中輸入http://localhost:15672登錄,使用默認用戶名:guest,默認用戶密碼:guest,見下圖所示

2. 配置監聽支持SSL的埠
2.1 生成證書
從github上克隆生成證書的專案,執行如下命令:
git clone https://github.com/Berico-Technologies/CMF-AMQP-Configuration.git && cd CMF-AMQP-Configuration/ssl
生成證書簽發機構
sh setup_ca.sh xxx //為自定義的證書簽發機構名稱,該腳本會在當前目錄下生成一個ca目錄,存盤證書頒發機構的資訊以及已經簽發的一些證書
生成服務端公鑰和私鑰
sh make_server_cert.sh rabbit-server 123456 //rabbit-client:生成的密鑰前綴名,自定義 123456: 訪問該密鑰的密碼,自定義,
生成客戶端公鑰和私鑰
sh create_client_cert.sh rabbit-client 123456 //同理如上
執行完腳本后ca、server和client的目錄分別為:



配置RabbitMQ服務(支持SSL)需要用到三個檔案如下:
ca/cacert.pem
server/rabbitmq-server.cert.pem
server/rabbitmq-server.key.pem
2.2 修改RabbitMQ的組態檔(開啟SSL)
修改/rabbitmqinaction/rabbitmq/etc/rabbitmq/rabbitmq.config檔案,若沒有則新建
vi /rabbitmqinaction/rabbitmq/etc/rabbitmq/rabbitmq.config
在rabbitmq.config檔案內添加:
[
{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/rabbitmq-server.cert.pem"},
{keyfile,"/etc/rabbitmq/ssl/server/rabbitmq-server.key.pem"},
{verify, verify_peer},
{fail_if_no_peer_cert, true},
{versions, ['tlsv1.2', 'tlsv1.1']}
]}
]}
].
注意: Windows用戶zai 組態檔中的反斜杠("")會被解釋為轉義序列- 因此如果將CA證書的路徑指定為c:\cacert.pem,那么你需要輸入{cacertfile, “c:\cacert.pem”}或{cacertfile, “c:/cacert.pem”}
ssl_listeners 指定SSL監聽5671埠,
設定{fail_if_no_peer_cert,false},宣告了我們準備接受客戶端,它們可以不向我們發送證書,
設定{verify,verify_peer},宣告如果客戶端沒有向我們發送證書, 我們必須能建立信任鏈,
設定{verify, verify_none},宣告在客戶端和服務器之間將不會發生證書交換,
重啟RabbitMQ服務
sudo rabbitmqctl stop
sudo rabbitmq-server -detached
重啟完RabbitMQ服務,可在web界面查看是否開啟了SSL監聽埠
三. 簡單測驗RabbitMQ(支持SSL)是否配置成功
1. 驗證RabbitMQ服務端是否配置成功
當RabbitMQ服務端監聽SSL埠后,可以使用OpenSSL命令列來驗證是否可以連接
openssl s_client -connect localhost:5671 -cert client/rabbit-client.cert.pem -key client/rabbit-client.key.pem -CAfile ca/cacert.pem
連接完后,查看RabbitMQ日志,日志檔案位置可在web界面查看

當連接建立的時候,broker日志檔案應該包含一個新的條目,如下圖所示:

至此配置RabbitMQ服務端配置完成!
2. 使用rabbitmq-c的第三方庫作為客戶端連接RabbitMQ broker
從github上拉取專案:
git clone https://github.com/alanxz/rabbitmq-c.git
安裝編譯程序不再贅述!
注意:ENABLE_SSL_SUPPORT=ON 選項要設定為ON
測驗程式如下:
int main(int argc, char const *const *argv)
{
char const *hostname;
int port, status;
int timeout;
amqp_socket_t *socket;
amqp_connection_state_t conn;
struct timeval tval;
struct timeval *tv;
hostname = "192.168.9.101";
port = 5671;
char const * exchange = "iotng.notification";
char const * messagebody = "hello world";
char const * nameusr = "jiangyao";
char const * password = "jiangyao";
char const *cacertfile = "E:/MyWork/jywork/GitCode/rabbittest/cacert.pem";
char const *key = "E:/MyWork/jywork/GitCode/rabbittest/rabbit-client.key.pem";
char const *cert =
"E:/MyWork/jywork/GitCode/rabbittest/rabbit-client.cert.pem";
timeout = atoi("3");
tv = &tval;
tv->tv_sec = timeout;
tv->tv_usec = 0;
conn = amqp_new_connection();
socket = amqp_ssl_socket_new(conn);
if (!socket) {
printf("creating TCP socket failed\n");
}
amqp_ssl_socket_set_verify_peer(socket, 0);
amqp_ssl_socket_set_verify_hostname(socket, 0);
die_on_error(amqp_ssl_socket_set_cacert(socket, cacertfile),
"setting CA certificate");
amqp_ssl_socket_set_verify_peer(socket, 1);
/*amqp_ssl_socket_set_verify_hostname(socket, 1);*/
die_on_error(
amqp_ssl_socket_set_key(socket, cert, key),
"setting client key");
status = amqp_socket_open_noblock(socket, hostname, port, tv);
if (AMQP_STATUS_OK != status) {
printf("opening TCP socket error:%d\n", status);
return false;
}
bool success = amqp_error(amqp_login(conn, "/", AMQP_DEFAULT_MAX_CHANNELS, AMQP_DEFAULT_FRAME_SIZE, 0, AMQP_SASL_METHOD_PLAIN, nameusr, password),
"Logging in");
if (!success) {
printf("amqp_login error\n");
return success;
}
amqp_channel_open(conn, 1);
success = amqp_error(amqp_get_rpc_reply(conn), "Opening channel");
if (!success) {
printf("Opening channel error\n");
return success;
}
{
amqp_table_entry_t entries[1];
entries[0].key = amqp_cstring_bytes("x-message-ttl");
entries[0].value.kind = AMQP_FIELD_KIND_UTF8;
entries[0].value.value.bytes = amqp_cstring_bytes("900");
amqp_table_t table;
table.entries = entries;
table.num_entries = 1;
amqp_exchange_declare(conn, 1, amqp_cstring_bytes("iotng.notification"), amqp_cstring_bytes("topic"), 0, 1, 0, 0, table);
}
success = amqp_error(amqp_get_rpc_reply(conn), "Declaring exchange");
amqp_basic_properties_t props;
props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG | AMQP_BASIC_DELIVERY_MODE_FLAG;
props.content_type = amqp_cstring_bytes("text/plain");
props.delivery_mode = 2; /* persistent delivery mode */
int ret = amqp_basic_publish(conn, 1, amqp_cstring_bytes("iotng.notification"), amqp_cstring_bytes("mq_sender_test_topic"), 0, 0, &props, amqp_cstring_bytes("hello world!"));
if (ret < 0) {
printf("amqp_basic_publish ret[%d]\n", ret);
}
else
{
printf("send message success!\n");
}
return 0;
}
參考博客:
https://www.cnblogs.com/web424/p/6761153.html.
http://www.blogjava.net/qbna350816/archive/2016/08/02/431433.aspx.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/229269.html
標籤:區塊鏈
