Может ли nodejs генерировать SSL-сертификаты?
Я пишу прокси-сервер HTTPS-HTTPS-прокси. Прежде чем использовать Python в качестве основного языка программирования, но меня интересует node.js, поэтому я готов к миграции.
Самая большая проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как создавать сертификаты CA и другие серверные сертификаты в node.js. В Python существует pyOpenSSL, который является удивительным. Я не нашел что-то подобное в node.js до сих пор.
Может быть, я должен использовать метод openssl-fork? Но как обрабатывать интерактивную операцию в openssl.
Спасибо.
Ответы
Ответ 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