Как использовать модуль запроса node.js, чтобы сделать вызов SSL с моим собственным сертификатом?

Я использую node.js и этот модуль запроса для совершения HTTP-вызовов на другой сервер.

https://github.com/mikeal/request

Он отлично работает. Теперь мне нужно изменить этот код, чтобы совершать вызовы через SSL, используя сертификат моей компании SSL. В документах модуля запроса он говорит об опции strictSSL:

"strictSSL - Установите значение true, чтобы требовать, чтобы SSL-сертификаты были действительными. Примечание: чтобы использовать собственный центр сертификации, вам нужно указать агент, который был создан с этим ca в качестве опции."

Это похоже на то, что мне нужно сделать, но я не понимаю эту фразу: "укажите агент, который был создан с этим ca как опция".

1) Что они подразумевают под "агентом"? 2) Как мне указать агента? 3) Как создать агент "с этим ca в качестве опции"?

Пример кода был бы потрясающим, но любые выводы были бы полезными. Спасибо.

Ответ 1

В основном это объясняется ответом Питера Лайона, приводя пример.

Я предполагаю, что вы запрашиваете домен, работающий через HTTPS, с сертификатом, подписанным вашим собственным центром сертификации (ca).

При использовании библиотеки запросов , как и вы, нет необходимости фактически создавать экземпляр агента самостоятельно, вы можете просто предоставить некоторые agentOptions к запросу, который вы делаете. Ниже приведен пример:

request({
  method: "POST",
  uri: "https://localhost/entries",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    name: "someEntry"
  }),
  agentOptions: {
    ca: fs.readFileSync("certs/ca.cert.pem")
  }
}, function(error, httpResponse, body) {
  //handle response
});

Здесь важна agentOptions, которую вы даете сертификату ок. Все домены, использующие сертификаты, подписанные ca, теперь принимаются. Представьте, что ca CA1 подписал три домена: D1, D2, D3. Установка ca в CA1 приводит к разрешению запросов ко всем доменам D1, D2, D3 (но не D4, подписанный другим ca).

Точка: "certs/ca.cert.pem" должен быть сертификатом центра сертификации подписи.

Ответ 2

  • "агент" означает экземпляр http.Agent из node стандартного http модуля
  • Документы указывают, что этот экземпляр агента будет передан в request в опции pool, я верю, хотя я этого и не сделал сам, и документы действительно разрежены здесь. Основываясь на снижении кода, я думаю, вам может понадобиться options.ca
  • запрос, по-видимому, напрямую поддерживает options.ca и использует его здесь в getAgent

Таким образом, моя догадка может быть просто передана в options.ca как строка, которая является открытым ключом вашего центра сертификации вашей компании и видит, что запрос делает правильную вещь оттуда.

Ответ 4

Возможно, я не понимаю проблему, но по своему опыту вам не нужно ничего делать вообще, если вы require('https'), вызов автоматически отключается через SSL.

Я только что протестировал это с помощью своего google-карты api-звонка, и действительно, если я require('http') Google жалуется, что он хочет, чтобы вызов включался через SSL, но когда я добавляю s, все работает так, как ожидалось.

Ответ 5

const request = require('request');

request.post({
                url: strRSAUrl,
                agentOptions: {
                    ca: fs.readFileSync('path-to-cacert.pem')
                },
                form: {
                    some_key: some_value,
                }
            }, function (error, response, body) {
                objResponse.send(body);
            });

Подробнее см. nodejs#request