Подтвердить что ты не робот

Может ли nodejs генерировать SSL-сертификаты?

Я пишу прокси-сервер HTTPS-HTTPS-прокси. Прежде чем использовать Python в качестве основного языка программирования, но меня интересует node.js, поэтому я готов к миграции.

Самая большая проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как создавать сертификаты CA и другие серверные сертификаты в node.js. В Python существует pyOpenSSL, который является удивительным. Я не нашел что-то подобное в node.js до сих пор.

Может быть, я должен использовать метод openssl-fork? Но как обрабатывать интерактивную операцию в openssl.

Спасибо.

4b9b3361

Ответ 1

Если кто-то хочет программно создавать CSR из node.js, я создал модуль nodejs, который использует openssl для создания закрытый ключ и CSR.

Изменить: используйте pem. Это гораздо более полная и, вероятно, более надежная.

Edit2: На самом деле, pem также является простой оболочкой над openssh. Для чистой реализации js рассмотрите forge

Ответ 2

Использовать оболочку для сертификата:

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

Затем используйте их в node.js

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

EDIT:

Вы также можете попробовать этот проект в NPM: https://npmjs.org/package/openssl-wrapper

Я нашел, что он ищет репозиторий NPM: https://npmjs.org/search?q=openssl

Я сам не пробовал или не проверял, но это похоже на способ создания сертификата с использованием node, который является исходным вопросом.

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

Меня бы заинтересовала обратная связь.;)

Ответ 3

узел-кузница разрешает это. Больше ничего сказать. НЕ ИСПОЛЬЗУЕТ команду opensl shell внутри.

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

Ответ 4

Ни одна из библиотек узлов, похоже, не поддерживает параметры, которые мне нужны, поэтому я использую исполняемый файл 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')
}

зависимости:

  • openssl исполняемый файл
  • пряжа добавить tempy