web-dev-qa-db-ja.com

nodejsはSSL証明書を生成できますか?

HTTPS-HTTPSプロキシをサポートするプロキシを作成しています。 Pythonをメインのプログラミング言語として使用する前に、今はnode.jsに興味があるので、移行の準備をします。

私が直面している最大の問題は、node.jsでCAおよびその他のサーバー証明書を生成する方法がわからないことです。 Pythonには、素晴らしいpyOpenSSLがあります。今までnode.jsに似たようなものは見つかりません。

たぶん、openssl-forkメソッドを使用する必要がありますか?しかし、opensslでの対話型操作の処理方法。

ありがとうございました。

33
ayanamist

誰かがdoesnode.jsからプログラムでCSRを作成したい場合、私は nodejsモジュールを作成 opensslを使用して作成します秘密鍵とCSR。

編集:代わりに pem を使用します。より完全で、おそらくより信頼性があります。

編集2:実際には、pemはopensshの単なるラッパーでもあります。純粋なjs実装については、 forge を調べてください。

25
Eric Vicenti

証明書にシェルを使用:

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) {
      ... 
})

編集:

NPMでこのプロジェクトを試すこともできます。 https://npmjs.org/package/openssl-wrapper

NPMリポジトリを検索していることがわかりました: https://npmjs.org/search?q=openssl

私は自分で試したりチェックしたりしませんでしたが、ノードを使用して証明書を生成する方法のように見えます。これは元の質問です。

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

フィードバックに興味があります。 ;)

33
Nicocube

node-forgeはそれを可能にします。これ以上言うことはありません。内部でopensslシェルコマンドを使用しません。

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

9
socketpair

必要なオプションをサポートしているノードライブラリはないため、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実行可能ファイル
  • ヤーンはテンプを追加します
0
Jay