node.js - 如何将 Node 的 amqplib 与 ssl 连接?

标签 node.js ssl rabbitmq amqp

我正在尝试连接我的 RabbitMQ 服务器,该服务器被迫使用 SSL,并受用户名和密码保护。以前,我成功地从 C#、PHP 和 Python 应用程序连接到此服务器。

这是我的 node.js 代码:

const amqp = require('amqplib');
const fs = require('fs');

const config = {...}

const opts = {
    ca: [fs.readFileSync(config.certificatePath)]
};

const url = `amqps://${config.username}:${config.password}@${config.hostname}:${config.port}`;

const open = amqp.connect(url, opts);

open.then(function(conn) {
    console.log('connected.');
}).then(null, console.warn);

我得到的错误是:无法获取本地颁发者证书

1)错误是什么意思?

2) 我需要做什么才能连接?

注意:在library's ssl guide它被写为“(必须)提供一个选项对象,该对象将传递给 tls.connect()”。 我无法理解这个指令,他们也没有使用 tls.connect() 的例子。我尝试了一些变体但失败了,也许它会给这里的人提供线索。

最佳答案

我尝试使用 amqplib 版本 0.5.3,这是我的工作示例,src/amqplib-ssl-example.js:

var fs = require('fs')
const path = require('path')

var opts = {
  cert: fs.readFileSync(path.resolve(__dirname, '../ssl/client/client_certificate.pem')),
  key: fs.readFileSync(path.resolve(__dirname, '../ssl/client/private_key.pem')),
  ca: [fs.readFileSync(path.resolve(__dirname, '../ssl/testca/ca_certificate_bundle.pem'))],
  rejectUnauthorized: false
}

var q = 'tasks'

function bail (err) {
  console.error(err)
  process.exit(1)
}

// Publisher
function publisher (conn) {
  conn.createChannel(onOpen)
  function onOpen (err, ch) {
    if (err != null) bail(err)
    ch.assertQueue(q)
    const msg = 'something to do'
    ch.sendToQueue(q, Buffer.from(msg))
    console.log('Publisher: ', msg)
  }
}

// Consumer
function consumer (conn) {
  conn.createChannel(onOpen)
  function onOpen (err, ch) {
    if (err != null) bail(err)
    ch.assertQueue(q)
    ch.consume(q, function (msg) {
      if (msg !== null) {
        console.log('Consumer: ', msg.content.toString())
        ch.ack(msg)
      }
    })
  }
}

require('amqplib/callback_api')
  .connect('amqps://guest:guest@localhost', opts, function (err, conn) {
    if (err != null) bail(err)
    consumer(conn)
    publisher(conn)
  })

当您运行此代码时,node src/amqplib-ssl-example.js,这是输出:

Publisher:  something to do
Consumer:  something to do

并且 RabbitMQ 服务器记录了以下消息,您可以在其中看到连接是通过 SSL 进行的。

rabbitmq_1  | 2019-03-24 00:05:41.579 [info] <0.431.0> started TLS (SSL) listener on [::]:5671
...
rabbitmq_1  | 2019-03-24 00:23:35.938 [info] <0.518.0> accepting AMQP connection <0.518.0> (192.168.96.1:45014 -> 192.168.96.2:5671)
rabbitmq_1  | 2019-03-24 00:23:35.949 [info] <0.518.0> connection <0.518.0> (192.168.96.1:45014 -> 192.168.96.2:5671): user 'guest' authenticated and granted access to vhost '/'

为了您的信息,我按照以下说明手动生成了此示例的证书:

https://www.rabbitmq.com/ssl.html#manual-certificate-generation

关于node.js - 如何将 Node 的 amqplib 与 ssl 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46832208/

相关文章:

rabbitmq - 如何在 RabbitMQ 队列中拥有超过 50,000 条消息

node.js - 上传到 Instagram 企业帐户的视频总是返回 "Media ID is not available"错误消息

node.js - 如何在 node.js 上调试 "Error: spawn ENOENT"?

javascript - 如何在 forEach 循环中使用 Puppeteer 的 page.click ?

ios - 在 iOS 应用程序中嵌入 SSL 根证书,而不是为整个系统安装它

c# - Rabbitmq:exchange->routingkey->queue命名结构

javascript - 几次成功调用后的 Nodejs Node-SOAP ETIMEDOUT

php - 使用 Silex 框架加密数据

python - SSL: SSLV3_ALERT_HANDSHAKE_FAILURE sslv3 警报握手失败 (_ssl.c:833)

java - Spring AMQP : would like to put message to queue and send ACK immediately