2015-03-26 4 views
10

J'utilise un outil CLI pour créer des applications mobiles hybrides avec une fonctionnalité de téléchargement sympa pour pouvoir tester l'application sur un appareil sans passer par le magasin d'applications (c'est ionique -cli). Cependant, dans mon entreprise comme tant d'autres entreprises, les demandes TLS sont re-signées avec le propre certificat CA personnalisé de l'entreprise que j'ai sur ma machine dans le trousseau (OS X). Toutefois, nodejs n'utilise pas le trousseau de clés pour faire confiance à sa liste de CA. Je ne contrôle pas l'application ionic-cli, donc je ne peux pas simplement passer une propriété {ca:} au module https. Je pourrais également voir ceci étant un problème pour n'importe quelle application de noeud que je ne contrôle pas. Est-il possible de dire à nodejs de faire confiance à une autorité de certification?Comment ajouter une autorité de certification personnalisée à nodejs

Je ne sais pas si cela appartenait à l'information de sécurité ou l'un des autres échanges ...

+0

bonne question. Nous avons aussi besoin d'une réponse! –

Répondre

3

Cela n'est actuellement possible que si vous compilez une version personnalisée de nodejs avec des certificats CA personnalisés. Les certs de CA hard-baked sont une limitation actuelle de nodejs jusqu'à ce que quelqu'un soumette un PR et qu'il soit fusionné. C'est un problème pour les autres aussi. Ci-dessous, j'ai quelques copies de solutions de contournement qui pourraient aider certaines personnes, mais probablement pas l'op.

Pour autant que je sais OP peut:

  • compilation personnalisée nodejs
  • soumettre un PR pour nodejs de résoudre le problème
  • fichier
  • une question ou PR avec-cli ionique pour soutenir certs CA personnalisé : https://github.com/driftyco/ionic-cli (comme suggéré par @Nate)
  • force moins de sécurité (pas de vérification TLS ou silence également suggéré par @Nate)

D'autres, si vous contrôlez l'application nodejs en question, vous avez plus d'options. Vous pouvez bien sûr spécifier le ca cert dans chaque requête. Certaines personnes intelligentes ont partagé certaines solutions de contournement dans le problème github https://github.com/nodejs/node/issues/4175. Je n'ai pas encore essayé toutes ces choses, donc pas de promesses, je partage juste ce que j'ai lu.

DuBistKomisch explique comment obtenir nodejs d'utiliser les certs du système d'exploitation CA:

Ma solution est de charger et d'analyser le système CA certs manuellement. Ensuite, comme recommandé par les documents de demande, transmettez-les avec l'option ca partout où nous faisons une demande. Je présume que vous pouvez également définir ca sur l'agent global si cela fonctionne pour votre cas d'utilisation.

fs.readFileSync('/etc/ssl/certs/ca-certificates.crt') 
    .toString() 
    .split(/-----END CERTIFICATE-----\n?/) 
    // may include an extra empty string at the end 
    .filter(function (cert) { return cert !== ''; }) 
    // effectively split after delimiter by adding it back 
    .map(function (cert) { return cert + '-----END CERTIFICATE-----\n'; }) 

mwain explique comment définir les CA certs globalement et non sur chaque demande https:

avait des problèmes similaires avec cela, ont des applications internes à l'aide d'un interne signé cert. A opté pour utiliser https.globalAgent et définir un tableau de CA qui sont définis dans une configuration et mis à jour sur une base d'env.

const trustedCa = [ 
    '/etc/pki/tls/certs/ca-bundle.crt', 
    '/path/to/custom/cert.crt' 
]; 

https.globalAgent.options.ca = []; 
for (const ca of trustedCa) { 
    https.globalAgent.options.ca.push(fs.readFileSync(ca)); 
} 
3

Puisque vous ne contrôlez pas l'application et ne peut pas passer l'option ca (la manière habituelle de le faire) , vous pouvez essayer de dire à Node de ne pas vérifier les certificats du tout, en définissant la variable d'environnement NODE_TLS_REJECT_UNAUTHORIZED. Par exemple:

$ export NODE_TLS_REJECT_UNAUTHORIZED=0 

Ensuite, exécutez l'application. Comme le dit @keinabel, lorsque vous faites cela, l'application va faire confiance à n'importe quel certificat (usurpé, faux, légitime), vous ouvrant à des attaques de type man-in-the-middle. La solution correcte et sûre serait pour les développeurs d'applications pour vous permettre de spécifier une autorité de certification de confiance.

+4

qui est un défaut de sécurité majeur – keinabel

+2

@keinabel: En effet, il est. Réponse mise à jour – Nate

+5

"La solution correcte et sûre serait pour les développeurs d'applications pour vous permettre de spécifier une autorité de certification de confiance." - La solution correcte serait que nodejs autorise la modification du magasin de certificats. Passer l'option ca est un hack moche, sauf si ce que vous voulez vraiment faire est l'épinglage de certificat. – Perseids

4

Je suis au courant de deux modules NPM qui gèrent ce problème lorsque vous contrôlez l'application:

  1. https://github.com/capriza/syswide-cas (je suis l'auteur de celui-ci)
  2. https://github.com/coolaj86/node-ssl-root-cas

node-ssl-root-cas regroupe ses propres copies des autorités de certification racine des nœuds et autorise également l'ajout de vos propres autorités de certification. Il place les certs sur l'agent global https, donc il ne sera utilisé que pour le module https, pas pour les connexions tls pures. En outre, vous aurez besoin d'étapes supplémentaires si vous utilisez un agent personnalisé au lieu de l'agent global.

syswide-cas charge les certificats à partir de répertoires prédéfinis (tels que/etc/ssl/certs) et utilise l'API interne de noeud pour les ajouter à la liste de confiance des autorités de certification conjointement avec les autorités de certification racine. Il n'est pas nécessaire d'utiliser l'option ca car elle effectue la modification globalement, ce qui affecte automatiquement tous les appels TLS ultérieurs. Il est également possible d'ajouter des CA à partir d'autres répertoires/fichiers si nécessaire. Il a été vérifié pour travailler avec noeud 0,10, noeud 5 et le noeud 6.

Puisque vous ne contrôlez pas l'application, vous pouvez créer un script wrapper pour permettre syswide-cas (ou node-ssl-root-cas), puis besoin le script ionique cli:

require('syswide-cas'); // this adds your custom CAs in addition to bundled CAs 
require('./path/to/real/script'); // this runs the actual script 
8

Node.js 7.3.0 ajouté NODE_EXTRA_CA_CERTS variable d'environnement pour vous de passer le fichier de certificat CA. Il sera plus sûr que de désactiver la vérification de certificat en utilisant NODE_TLS_REJECT_UNAUTHORIZED.

$ export NODE_EXTRA_CA_CERTS=[your CA certificate file path]