web-dev-qa-db-fra.com

Comment utiliser le module de requête node.js pour passer un appel SSL avec mon propre certificat?

J'utilise node.js et ce module de demande pour effectuer des appels HTTP vers un autre serveur.

https://github.com/mikeal/request

Cela fonctionne très bien. Je dois maintenant modifier ce code pour passer les appels via SSL, en utilisant le certificat SSL de mon entreprise. Dans les documents du module de demande, il est dit ceci à propos de l'option strictSSL:

"strictSSL - Défini sur true pour exiger que les certificats SSL soient valides. Remarque: pour utiliser votre propre autorité de certification, vous devez spécifier un agent qui a été créé avec ce ca en option."

Cela ressemble à ce que je dois faire, mais je ne comprends pas cette phrase: "spécifiez un agent qui a été créé avec ce ca en option.".

1) Qu'entendent-ils par "un agent"? 2) Comment puis-je "spécifier un agent" 3) Comment créer l'agent "avec cette option"?

Un exemple de code serait étonnant, mais toutes les pistes seraient utiles. Merci.

19
Jake

Cela explique en grande partie réponse de Peter Lyons , en fournissant un exemple.

Je suppose que vous demandez un domaine fonctionnant sur HTTPS avec un certificat signé par le vôtre autorité de certification (ca).

Lorsque vous utilisez bibliothèque de requêtes , comme vous le faites, il n'est pas nécessaire d'instancier réellement l'agent vous-même, vous pouvez simplement fournir un agentOptions à la requête que vous faites. Ce qui suit est un exemple:

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
});

L'important ici est le agentOptions, auquel vous fournissez le certificat d'un ca. Tous les domaines utilisant des certificats signés par l'AC sont maintenant acceptés. Imaginez un ca CA1 a signé trois domaines, D1 , D2 , D3 . La définition de ca sur CA1 entraîne l'autorisation de demandes à tous les domaines D1 , D2 , D3 (mais pas D4 signé par un autre ca).

Le point étant: le "certs/ca.cert.pem" doit être le certificat de l'autorité de certification signataire.

10
Niels Abildgaard
  1. "un agent" signifie une instance de http.Agent du module standard de noeud http
  2. Les documents indiquent que cette instance d'agent serait passée à request dans l'option pool je crois, bien que je ne l'ai pas fait moi-même et les documents sont en effet rares sur les détails ici. Sur la base du survol du code, je pense que vous pourriez avoir besoin de options.ca
  3. la demande semble prendre directement en charge options.ca et l'utilise ici dans getAgent

Donc, je suppose que peut-être juste passer options.ca en tant que chaîne qui est la clé publique de l'autorité de certification de votre entreprise et voyez si la demande fait la bonne chose à partir de là.

4
Peter Lyons
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);
            });

Pour plus de détails, vous pouvez vous référer à nodejs#request

2
RIYAJ KHAN

Je suis tombé sur le même problème et j'ai creusé, et j'ai finalement trouvé que ce cas de test était le meilleur exemple de ce dont nous avons besoin:

https://github.com/mikeal/request/blob/63f31cb1d170a4af498fbdd7566f867423caf8e3/tests/ssl/ca/server.js

1
Michael Yin

peut-être que je comprends mal le problème, mais d'après mon expérience, vous n'avez rien à faire de spécial si vous require('https'), l'appel sort automatiquement via SSL.

Je viens de tester cela avec mon appel api google maps et en effet si je require('http') Google se plaint qu'il veut que l'appel arrive via SSL, mais quand j'ajoute le s tout fonctionne comme prévu.

0
Genia S.