web-dev-qa-db-fra.com

Nodejs peut-il générer des certificats SSL?

J'écris un proxy de support proxy HTTPS-HTTPS. Avant d’utiliser Python comme langage de programmation principal, mais je suis intéressé par node.js maintenant, je me prépare donc à migrer.

Le plus gros problème auquel je suis confronté est que je ne sais pas comment générer des certificats de CA et autres certificats de serveur dans node.js. En Python, il existe pyOpenSSL qui est génial. Je ne trouve pas quelque chose de similaire dans node.js jusqu'à présent.

Peut-être que je devrais utiliser la méthode openssl-fork? Mais comment gérer l'opération interactive dans openssl.

Je vous remercie.

31
ayanamist

Dans le cas où quelqu'un veut créer par programme une CSR à partir de node.js, j'ai créé un module nodejs qui utilise openssl pour créer une clé privée et une CSR.

Edit: Utilisez pem à la place. C'est beaucoup plus complet et probablement plus fiable.

Edit2: En fait, pem est aussi juste un simple wrapper sur openssh. Pour une implémentation JS pure, regardez dans forge

22
Eric Vicenti

Utiliser Shell pour le certificat:

openssl genrsa -out server-key.pem 1024
openssl req -new -key server-key.pem -out server-csr.pem
openssl x509 -req -in server-csr.pem -signkey server-key.pem -out server-cert.pem

Puis utilisez les dans node.js

var https = require('https');
https.createServer({
    key: fs.readFileSync('server-key.pem'),
    cert: fs.readFileSync('server-cert.pem')
},
function (req,res) {
      ... 
})

MODIFIER:

Vous pouvez également essayer ce projet dans NPM: https://npmjs.org/package/openssl-wrapper

Je l'ai trouvé en consultant le référentiel NPM: https://npmjs.org/search?q=openssl

Je n'ai pas essayé ou vérifié moi-même, mais cela ressemble à un moyen de générer le certificat en utilisant noeud, ce qui est la question initiale.

var openssl = require('openssl-wrapper');
var password = 'github';

return openssl.exec('genrsa', {des3: true, passout: 'pass:' + password, '2048': false}, function(err, buffer) {
    console.log(buffer.toString());
});

Je serais intéressé par un feedback. ;)

33
Nicocube

noeud-forge permet que. Rien à dire de plus. N'UTILISE PAS la commande shell openssl en interne.

https://github.com/digitalbazaar/forge#x509

7
socketpair

Aucune des bibliothèques de nœuds ne semble prendre en charge les options dont j'ai besoin. J'utilise donc l'exécutable openssl.

import { execSync } from 'child_process'
import fs from 'fs'
import tempy from 'tempy'

const extHeader = `authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
`
const Shell = cmd => execSync(cmd, { stdio: 'pipe' })

const writeCert = (extFile, outfile) => {
  const cmd = [
    `openssl`,
    `x509`,
    `-req`,
    `-in ssl/my.csr`,
    `-CA ssl/root-ca.pem`,
    `-CAkey ssl/root-ca.key`,
    `-CAserial ssl/root-ca.srl`,
    `-out ssl/${outfile}`,
    `-days 1825`,
    `-sha256`,
    `-extfile ${extFile}`,
    `-passin pass:mypassphrase`
  ]
  Shell(cmd.join(' '))
}

const createCert = domains => {
  const sans = domains.map((d, i) => `DNS.${i + 1} = ${d}`)
  const ext = extHeader + sans.join('\n')
  const extFile = tempy.file()
  fs.writeFileSync(extFile, ext, 'utf-8')
  writeCert(extFile, 'out.crt')
}

Les dépendances:

  • openSL exécutable
  • fils ajouter tempy
0
Jay